2016-12-09 4 views
0

у меня есть уникальный случай, когда мне нужно заполнить меню с тысячами элементов из базы данных SQLite ...населёно NSPopupButton с тысячами пунктов

В настоящее время я наполняя его с помощью следующего кода, но блоки основной поток при его заполнении, и занимает больше минуты, чтобы загрузить (в первый раз), поскольку он заполняет ~ 3000 предметов. Есть ли эффективный способ ленивой загрузки меню в небольших кусках без блокировки ui?

rules.h

{ 
    IBOutlet NSPopUpButton *rulesSelectionButton; 
} 
@property (retain) IBOutlet NSPopUpButton *rulesSelectionButton; 

rules.m

@synthesize rulesSelectionButton; 

и код для заполнения кнопку:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
NSString *selected = [defaults objectForKey:rulesSelectionString]; 
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 

    NSString *path = [dbPath stringByExpandingTildeInPath]; 
    __block NSArray *final = [NSArray new]; 

    FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:path]; 
    [queue inDatabase:^(FMDatabase *db) { 
     FMResultSet *results = [db executeQuery:@"SELECT * FROM rules"]; 
     NSMutableArray *array = [NSMutableArray new]; 
     [array addObject:NSLocalizedString(@"Random...", nil)]; 

     while ([results next]) { 
      @autoreleasepool { 
       NSString *title = [NSString stringWithFormat:@"%@ (%@)", [results stringForColumn:@"Organization_Rules"], [results stringForColumn:@"Assignment"]]; 
       [array addObject:title]; 
      } 
     } 
     final = [[NSSet setWithArray:array] allObjects]; 
    }]; 

    NSArray *sortedKeys = [final sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)]; 
    dispatch_async(dispatch_get_main_queue(), ^{ 

     [rulesSelectionButton removeAllItems]; 
     [rulesSelectionButton addItemsWithTitles:sortedKeys]; 
     [rulesSelectionButton selectItemWithTitle:selected]; 
    }); 
}); 
+0

Я не вижу ни одного слова «NSPopUpButton» в вашем коде. В любом случае было бы неплохо создать тысячи пунктов меню. –

+0

rulesSelectionButton - это свойство, я добавил соответствующий код. Возможно, это плохая идея поместить тысячи пунктов меню в меню, но мне все же нужно сделать это, как лучший способ представления данных. – gypsyDev

+0

Я не думаю, что это лучший способ представления данных, потому что NSPopUpButton не предназначен для передачи тысяч предметов. Apple говорит: «Используйте всплывающее меню, чтобы представить до 12 взаимно исключающих вариантов, которые пользователям не нужно видеть все время». и «Рассмотрите возможность использования списка прокрутки вместо всплывающего меню для большого количества элементов». – Willeke

ответ

0

NSComboBox является гораздо лучше подходят для огромного списка и на самом деле намного проще настроить, чем NSPopupBotton ... хотя это выглядит не так хорошо.