2017-02-02 5 views
1

Я инстанцирование NSFetchedResultsController с fetchRequest абстрактного класса:инстанцирование NSFetchedResultsController оканчивающегося неперехваченного исключением

private func setupFetchController() { 
    let fetchRequest : NSFetchRequest<NSFetchRequestResult> = SearchEntity.fetchRequest() 
    let fetchController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: context, sectionNameKeyPath: nil, cacheName: nil) 
    self.fetchController = fetchController 
} 

SearchEntity является абстрактным родительским классом Person и Group. Я использовал это, чтобы получить 2 объекта с 1 NSFetchedResultsController. Однако аварий приложений, когда эта функция называется:

LibC++ abi.dylib: оканчивающийся неперехваченным исключением типа NSException

я сузил его до раскомментировав и комментирования создания NSFetchedResultsController , У меня есть еще две функции, которые работают точно так же.

Что я делаю/происходит неправильно?

Редактировать: Добавить к этому. Я могу вручную извлечь SearchEntity, просто используя context.performFetch(...), который дает мне правильные результаты. Однако, следовательно, имя, я собираюсь выполнить поиск, чтобы я мог эффективно обновлять данные.

edit2:

Пример той же функции в других местах, которые функционируют:

private func setupFetchController() { 
    let fetchRequest : NSFetchRequest<NSFetchRequestResult> = Person.fetchRequest() 

    // Sort Persons 
    let sortDescriptor = NSSortDescriptor(key: "firstName", ascending: true) 
    let sortDescriptor2 = NSSortDescriptor(key: "lastName", ascending: true) 
    fetchRequest.sortDescriptors = [sortDescriptor, sortDescriptor2] 

    // Filter Persons (only iType = 1) 
    let predicate = NSPredicate(format: "iType == %i", 1) 
    fetchRequest.predicate = predicate 

    // Create the FetchController 
    let fetchController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: context, sectionNameKeyPath: "sectionName", cacheName: nil) 
    self.fetchController = fetchController 
} 
+0

Вы сказали: «У меня есть еще две из этих функций с точно таким же стилем, который работает». Что вы имели в виду? И обе функции одного типа? Я имею в виду, что они функции FRC? – Mannopson

+0

Я добавлю их в OP, они также создают экземпляр FetchResultsController, но с другим объектом. – Emptyless

+0

Единственная разница не в добавлении sortDescriptors/predicates – Emptyless

ответ

4

Вы получаете исключение, потому что требуется по меньшей мере, один вид дескриптора.

От documentation:

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

1) Запрос на выборку. Это должно содержать по крайней мере один дескриптор сортировки до заказать результаты.

2) Контекст управляемого объекта. Контроллер использует этот контекст для выполнения запроса на выборку.

3) Необязательно, путь ключа к объектам результатов, который возвращает имя раздела . Контроллер использует ключевой путь для разделения результатов на разделы (передача nil указывает на то, что контроллер должен сгенерировать один раздел ).

4) Возможно, имя файла кэша, который контроллер должен использовать (передача nil предотвращает кеширование). Использование кеша может избежать накладных расходов вычисления информации раздела и индекса.