Intereting Posts
Измените размер супервизора и всех братьев и сестер супервизора, используя автозапуск Более быстрое увеличение с более длительной продолжительностью удержания UIButton Невозможно изменить размер шрифта на UILabel в iOS Изучите Objective-C или Swift Приложение Core Data iOS падает при получении контекста IOS 9 Отправка почтового запроса, заблокированного ATS, Bypass не работает IOS – Рекурсивные функции оставляют выделение памяти Использование UIActivityViewController в моноточе iOS 9, 10 CoreData: не удалось загрузить оптимизированную модель по пути Смешивание NSManagedObjects и обычных объектов в RestKit Как я могу отправить данные на принтер ethernet с iPhone / iPad программно? Как изменить размер символов внутри UIPicker iOS: отслеживание местоположения пользователя Выберите и удалите / удалите несколько строк одновременно в быстром UITableView iOS UIDatePicker установил максимальную дату

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 }