0

Это заставляло меня гать весь день.Основные отношения данных, NSPredicates и NSFetchedResultsController

У меня есть странная ошибка, я думаю, что я сузился до NSPredicate. У меня есть два объекта: List и Person. Список имеет отношение ко многим для лиц, называемых людьми, и у человека есть отношение ко многим для списков, называемых списками.

Перехожу к контроллеру tableview объекта List. Затем я хочу, чтобы этот контроллер таблицы отображал Лица, принадлежащие этому объекту списка. Я делаю это с NSFetchedResultsController.

При настройке NSFRC у меня есть следующий код (управление памятью опущено для ясности). Список в вопросе myList:

// Create the request and set it's entity 
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Person" inManagedObjectContext:managedObjectContext]; 
[fetchRequest setEntity:entity]; 

// Create a predicate to get the persons that belong to this list 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(ANY lists == %@)", myList]; 

// Assign this predicate to the fetch request 
[fetchRequest setPredicate:predicate]; 

// Define some descriptors 
NSSortDescriptor *locationDescriptor = [[NSSortDescriptor alloc] initWithKey:@"location" ascending:YES]; 
NSSortDescriptor *lastNameDescriptor = [[NSSortDescriptor alloc] initWithKey:@"lastName" ascending:YES]; 
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:locationDescriptor, lastNameDescriptor, nil]; 
[fetchRequest setSortDescriptors:sortDescriptors]; 

// Create and initialize the fetch results controller. 
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:@"location" cacheName:nil]; 
self.fetchedResultsController = aFetchedResultsController; 
fetchedResultsController.delegate = self; 

Я думаю, что проблема с этой линией (так как он исчезает, если я удалить его):

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(ANY lists == %@)", myList]; 

Что происходит, когда родительский вид проходит myList к контроллер таблицы, симулятор просто висит. Никакой аварийный журнал в консоли или что-то еще. Это похоже на то, что просто нужно, чтобы AGES разобрался с NSFRC.

Это проблема с предикатом, который я использую?

ответ

0

Спасибо за предложения re: использование NSSet. После нескольких часов отслеживания ошибок я понял, что проблема заключается в моем методе cellForIndexPath в представлении таблицы (поэтому, не связанный с NSFRC).

1

Вам нужно использовать NSFetchedResultsController, когда вы можете получить Person s из списка, переданного в таблицуViewController?

NSSet *people = myList.persons; 
+0

Вы должны были отредактировать свое оригинальное сообщение, чтобы спросить об этом. – indragie

1

Вы правильно, вы можете просто использовать myList.persons, NSFetchedResultsController не является необходимым в данной ситуации.

+0

ваш комментарий в замешательстве. мой ответ дает альтернативу, которая требует перепроектирования tableViewController. – falconcreek

+1

Извините, я, наверное, неправильно понял. Но ваш ответ правильный. – indragie

 Смежные вопросы

  • Нет связанных вопросов^_^