Поскольку ваш массив things
является изменяемой копией fetchedObjects
контроллера выбранных результатов, ни одна из манипуляций, выполняемых вами для things
, не дает никакого результата на fetchedObjects
.
Отображается только ручное изменение, поскольку все это изменение происходит в методах didChange...
контроллера выбранных результатов.
Редактировать:
Ваша проблема здесь:
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"displayOrder1" ascending:YES];
NSSortDescriptor *sortDescriptor2 = [[NSSortDescriptor alloc] initWithKey:@"area" ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor2 ,sortDescriptor ,nil];
[fetchRequest setSortDescriptors:sortDescriptors];
[sortDescriptor release];
[sortDescriptor2 release];
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:@"area" cacheName:@"Root"];
Из документов NSFetchedResultsController:
sectionNameKeyPath ... Ifэтот путь ключа не совпадает с указанным первым дескриптором сортировки в fetchRequest, они должны генерировать одинаковые относительные упорядочения.Например, первый дескриптор сортировки в fetchRequest может указывать ключ для постоянного свойства;sectionNameKeyPath может указывать ключ для переходного свойства, полученного из постоянного свойства.
Ваш первичный ключ сортировки - displayOrder
, но ваш sectionNameKeyPath - area
, и я сомневаюсь, что они производят такой же порядок сортировки.
Обычно плохая практика помещать интерфейсную функцию, например displayOrder, в модель данных.Что произойдет, если у вас несколько столов с разными порядками?Если порядок не является произвольным и не требует сохранения приложением, не создавайте атрибут.
Кроме того, в двух местах кода есть такая конструкция:
if (userDrivenDataModelChange)return;{
//...
}
Хотя синтаксически это допустимо, это всего лишь ошибка, ожидающая своего появления.Если утверждение верно, метод возвращается немедленно.Если false, блок выполняется.Это уродливая, уродливая конструкция, которую легко понять неправильно.Кроме того, вы выдаете недействительный возврат.Компилятор предупредит вас об этом, и вы должны обратить на это внимание.