Я разрабатываю приложение macOS в Objective-C.Я хотел бы добавить в качестве функции возможность сортировки NSTableView, чтобы показать выбранные элементы перед другими.Мой код:
NSUInteger idx = [self.itemsTableView.selectedRowIndexes firstIndex];
NSMutableArray *selectedObjects = [NSMutableArray new];
while (idx != NSNotFound)
{
// do work with "idx"
// NSLog (@"The current index is %lu", (unsigned long)idx);
[selectedObjects addObject:self.items[idx]];
// get the next index in the set
idx = [self.itemsTableView.selectedRowIndexes indexGreaterThanIndex:idx];
}
self.items = [self.unFilteredItems sortedArrayUsingComparator:^NSComparisonResult(id _Nonnull obj1, id _Nonnull obj2) {
BOOL obj1Exists = [selectedObjects containsObject:obj1];
BOOL obj2Exists = [selectedObjects containsObject:obj2];
if (obj1Exists && !obj2Exists) {
return NSOrderedAscending;
}
if (obj1Exists && obj2Exists) {
return NSOrderedSame;
}
if (!obj1Exists && !obj2Exists) {
return NSOrderedSame;
}
if (!obj1Exists && obj2Exists) {
return NSOrderedDescending;
}
return NSOrderedSame;
}];
[self.itemsTableView reloadData];
К сожалению, для примерно 70 000 наименований и для выбора из 4500 наименований компаратор занимает слишком много времени.Кто-нибудь может указать мне альтернативное решение проблемы?Спасибо за любую помощь.
Редактировать:
Я попробовал другое решение, которое оказывается быстрее, но все же недостаточно быстро:
NSUInteger idx = [self.myMessagesTableView.selectedRowIndexes firstIndex];
NSMutableArray *selectedObjects = [NSMutableArray new];
while (idx != NSNotFound)
{
// do work with "idx"
// NSLog (@"The current index is %lu", (unsigned long)idx);
[selectedObjects addObject:self.myMessages[idx]];
// get the next index in the set
idx = [self.myMessagesTableView.selectedRowIndexes indexGreaterThanIndex:idx];
}
NSMutableArray *unselectedObjects = [NSMutableArray new];
[self.unFilteredItems enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
if (![selectedObjects containsObject:obj]) {
[unselectedObjects addObject:obj];
}
}];
self.items = selectedObjects;
self.items = [self.items arrayByAddingObjectsFromArray:unselectedObjects];
[self.itemsTableView reloadData];
Я надеюсь, что кто-то может указатья в правильном направлении, вероятно, пытаясь использовать индексы выбора вместо массива выбранных объектов.Еще раз спасибо.