у меня есть уникальный случай, когда мне нужно заполнить меню с тысячами элементов из базы данных 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];
});
});
Я не вижу ни одного слова «NSPopUpButton» в вашем коде. В любом случае было бы неплохо создать тысячи пунктов меню. –
rulesSelectionButton - это свойство, я добавил соответствующий код. Возможно, это плохая идея поместить тысячи пунктов меню в меню, но мне все же нужно сделать это, как лучший способ представления данных. – gypsyDev
Я не думаю, что это лучший способ представления данных, потому что NSPopUpButton не предназначен для передачи тысяч предметов. Apple говорит: «Используйте всплывающее меню, чтобы представить до 12 взаимно исключающих вариантов, которые пользователям не нужно видеть все время». и «Рассмотрите возможность использования списка прокрутки вместо всплывающего меню для большого количества элементов». – Willeke