Intereting Posts
Почему я не могу сохранить файлы в каталоге iOS apps / Documents? Получить значение из IBOutlet из другого класса Получение всех выбранных значений ячеек Убедитесь, что UITextField не содержит букв IndexPath не показывает правильный номер для iOS? Размер рамки UIView при загрузке из Nib? Как сделать операции переключения на основе NSString более эффективными и масштабируемыми? Указание GCC_PREPROCESSOR_DEFINITIONS для кокоапода из подфайла объяснение для deinit не называется Как передать имя пользователя / пароль внешнему браузеру iOS для аутентификации? Потоковое воспроизведение звука с одного устройства IOS на другое Построить OpenCV для iOS Как использовать / протестировать изменения пользовательской информации NSProgress дочернего экземпляра NSProgress Редактирование ширины CollectionViewCell Слияние двух клипов с различными ориентациями с использованием AVMutableCompasition / AVFoundation

NSFetchedResultsController сортирует в неправильном порядке

Я работаю над проектом, основанным на примере CoreData от Xcode. У меня есть сущность-класс с именем Entity с updated ключом, который хранит метку времени, в которой объект был обновлен, и NSFetchResultsController настроен на сортировку с ним в порядке убывания:

 NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; [fetchRequest setEntity:[NSEntityDescription entityForName:@"Entity" inManagedObjectContext:_managedObjectContext]]; [fetchRequest setFetchBatchSize:20]; [fetchRequest setSortDescriptors:@[[[NSSortDescriptor alloc] initWithKey:@"updated" ascending:NO]]]; NSFetchedResultsController *frc = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:_managedObjectContext sectionNameKeyPath:nil cacheName:nil]; 

Это отлично работает при начальной загрузке, но когда я вставляю NSManagedObject, который должен быть вставлен между другими объектами, он вставлен вверху. Когда я перезапускаю приложение, он вставлен в нужное положение.

например: первоначально таблица выглядела бы так:

 updated: 300 updated: 200 updated: 100 

и когда я вставляю ManagedObject: updated: 250 , я ожидаю, что таблица будет выглядеть так:

 updated: 300 updated: 250 <-- inserted here updated: 200 updated: 100 

но это то, что я получаю:

 updated: 250 <-- inserted at the top updated: 300 updated: 200 updated: 100 

Это как работает NSFetchResultsController, или есть способ повторно сортировать все NSManagedObjects на каждой вставке? Благодаря 🙂

Мой собственный ответ

NSManagedObject имеет свой метод isUpdated , поэтому наличие сущности с updated именем ключа недействительно.

Методы, которые вы не должны переопределять

Сам NSManagedObject настраивает многие функции NSObject, чтобы управляемые объекты могли быть правильно интегрированы в инфраструктуру основных данных. Основные данные полагаются на реализацию NSManagedObject следующих методов, которые вы поэтому абсолютно не должны переопределять: primitiveValueForKey :, setPrimitiveValue: forKey :, isEqual :, хэш, суперкласс, класс, self, isProxy, isKindOfClass :, isMemberOfClass :, соответствуетToProtocol :, отвечаетToSelector :, managedObjectContext, entity, objectID, isInserted, isUpdated , isDeleted, …

http://developer.apple.com/library/ios/#documentation/cocoa/Reference/CoreDataFramework/Classes/NSManagedObject_Class/Reference/NSManagedObject.html

По умолчанию новый объект всегда будет вставлен в начало. Вы должны сохранить индекс для всех объектов, если хотите настроить сортировку. Затем вы можете сортировать свои объекты в любом случае.

Вы также можете использовать NSArray для сортировки по вашему методу делегирования

 -(void)controllerWillChangeContent:(NSFetchedResultsController *)controller { NSArrary *resultsArray = [controller allObjects]; // sort NSSortDescriptor *sortDescriptor; sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"updated" ascending:NO]; NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor]; NSArray *sortedArray; sortedArray = [reultsArray sortedArrayUsingDescriptors:sortDescriptors]; // reload table using this array }