Нет, я просто не включил его во фрагмент. Я включил весь метод, если это проясняет ситуацию.

тоящее время я пытаюсь заполнить UITableView в моем проекте из Core Data с помощью NSFetchedResultsController. Я использую пользовательский поиск с компаратором (хотя я также пробовал селектор и имел ту же проблему):

    if (fetchedResultsController != nil) {
        return fetchedResultsController;
    }

    /*
     Set up the fetched results controller.
    */
    // Create the fetch request for the entity.
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    // Edit the entity name as appropriate.
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Object" inManagedObjectContext:self.managedObjectContext];
    [fetchRequest setEntity:entity];

    // Set the batch size to a suitable number.
    [fetchRequest setFetchBatchSize:20];
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"objectName" ascending:YES comparator:^(id s1, id s2) {
            NSLog(@"Comparator");
      //custom compare here with print statement
    }];
    NSLog(@"Sort Descriptor Set");
    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Object" inManagedObjectContext:self.managedObjectContext];
    [fetchRequest setEntity:entity];
    [fetchRequest setSortDescriptors:sortDescriptors];

    NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:@"firstLetterOfObject" cacheName:@"Objects"];
    [aFetchedResultsController release];
    [fetchRequest release];
    [sortDescriptor release];
    [sortDescriptors release];
    if (![fetchedResultsController performFetch:&error]) {
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }

    return fetchedResultsController;

Когда я захожу на эту вкладку, я регистрируюсь во всей программе и обнаружил, что NSFetchedResultsController даже не входит в блок компаратора при получении. Вместо этого он сортирует его с помощью некоторого метода сортировки по умолчанию.

Однако, если я удаляю и добавляю объект с objectName, он входит в блок компаратора и правильно сортирует таблицу.

Почему NSFetchedResultsController не сортирует, используя компаратор, пока модель управляемого объекта не будет изменена?

Примечания: я попытался также отключить кэширование и / или выполнить выборку в viewDidLoad :, но кажется, что сколько раз я получаю выборку, не имеет значения, но когда. По какой-то причине он использует мою сортировку только после изменения объектной модели.

Ответы на вопрос(3)

и способ ее обойти - изменить объект, сохранить изменение, затем восстановить его первоначальное значение и сохранить снова.

    // try to force an update for correct initial sorting bug
NSInteger count = [self.fetchedResultsController.sections count];
if (count > 0) {
    id <NSFetchedResultsSectionInfo> sectionInfo = [[self.fetchedResultsController sections] objectAtIndex:0];
    count = [sectionInfo numberOfObjects];
    if (count > 0) {
        NSManagedObject *obj = [self.fetchedResultsController objectAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];
        NSString *name = [obj valueForKey:@"name"];
        [obj setValue:@"X" forKey:@"name"];
        // Save the context.
        [self saveContext];
        [obj setValue:name forKey:@"name"];
        // Save the context.
        [self saveContext];
    }
}
Решение Вопроса

о которых я могу думать. Во-первых, хотя это может и не быть вашей проблемой, вы не можете сортировать переходные свойства. Но более вероятно, что при сортировке в модели, поддерживаемой хранилищем SQL, компаратор «компилируется» в запрос SQL, и не все функции Objective-C доступны. В этом случае вам нужно будет выполнить сортировку в памяти после выполнения выборки.

РЕДАКТИРОВАТЬ: увидеть этодокторв частности, раздел «Выборка предикатов и дескрипторы сортировки».

 Matthew Bischoff26 янв. 2011 г., 00:09
Еще раз спасибо, Дон. Похоже, вы нашли эту документацию в документации. Я также получил эту работу, загрузив все в массив и работая с ним, чтобы заполнить список и определить разделы, в соответствии с другим вопросом стекопотока, который я нашел. Все работает отлично.
 Don26 янв. 2011 г., 00:27
Большой! Рад, что ты получил это работает. Я также нашел это на Cocoa Is My Girlfriend, которая также предлагает использовать свойство sortOrder:cimgf.com/2010/06/05/re-ordering-nsfetchedresultscontroller
 Matthew Bischoff25 янв. 2011 г., 17:50
На самом деле, более общая проблема заключается в том, что я внедряю разделы в мое табличное представление вместе с индексом раздела. Я помещаю любой объект, начинающийся с цифры, в раздел «123» (это работает), но я хочу, чтобы этот раздел был внизу, как приложение iPod. Согласно приложениям Apple, числа s должны быть последним параметром в sectionIndex (я использую UILocalizedIndexedCollation для генерации индексов разделов). Однако, похоже, нет способа извлечь разделы так, чтобы числа были последними. Вы знаете более надежный способ сделать это, чем обычная сортировка?
 Don25 янв. 2011 г., 18:16
Просто предположение, но я думаю, что блок компаратора работает после того, как объектная модель была изменена, потому что график уже находится в памяти. Но это только предположение. Я полагаю, что способ сортировки вручную заключается в создании подкласса NSArrayController, поэтому вы потеряете преимущества NSFetchedResultsController. Но, как вы говорите, корень проблемы в том, что вы хотите отсортировать числа по дну. Вдобавок ко всему, я бы сказал, создайте свойство порядка сортировки для ваших объектов и используйте его, но я не сделал достаточной пользовательской сортировки с использованием дескрипторов сортировки.
 Matthew Bischoff25 янв. 2011 г., 17:32
Они не являются временными свойствами, но ваше другое предложение определенно может быть проблемой. Единственная проблема заключается в том, что я полагаюсь на контроллер fetchedresults для предоставления имен разделов и тому подобного табличному представлению, поэтому сортировка в памяти каждый раз будет затруднена (я думаю). Как бы вы посоветовали? И другой мой вопрос: почему блок компаратора работает после изменения объектной модели? Спасибо!

NSError *error;
BOOL success = [aFetchedResultsController performFetch:&error];

Не забудьте также отпустить запрос:

[fetchRequest release];
 Matthew Bischoff25 янв. 2011 г., 16:46
Нет, я просто не включил его во фрагмент. Я включил весь метод, если это проясняет ситуацию.

Ваш ответ на вопрос