2015-06-18 7 views
0

Итак, у меня есть объект Core Data, который я пытаюсь отобразить в виде таблицы с помощью NSFetchedResultsController. Соответствующая модель атрибутов выглядит следующим образом:NSFetchedResultsController group group by relation

Сообщение

  • parentPost (ОТМ отношение)
  • childPosts (обратный parentPost)
  • RootParent (ОТМ отношение, указывает на верхней части дерево)
  • allChildren (обратная сторона rootParent, показывает сплюснутые дети корневого объекта)

Отношения образуют дерево с корнем Post, являющимся тем местом, где parentPost = nil. Способ, которым я хочу, чтобы это отображалось, заключается в том, что каждый корневой столбец является первым элементом в разделе, а затем остальные строки являются сплющенным списком дочерних элементов корня.

Это достаточно легко организовать вручную, выполнив запрос выборки, как это:

 let fetchRequest = NSFetchRequest(entityName: Post.entityName()) 
     fetchRequest.predicate = NSPredicate(format: "parentPost = NULL") 
     fetchRequest.sortDescriptors = sortOrder.sortDescriptors 
     fetchRequest.fetchBatchSize = 20 
     fetchRequest.relationshipKeyPathsForPrefetching = ["allChildren"] 

Тогда я могу построить раздел массив из каждого из результатов делать что-то вроде этого:

let sectionPost = self.fetchedResultsController!.fetchedObjects![section] as! Post 
    var sectionArray = NSMutableArray(object: sectionPost) 
    var filteredSet = sectionPost.allChildren.filteredOrderedSetUsingPredicate(NSPredicate(format: "approved != FALSE AND postDeleted != TRUE AND spam != TRUE")) 
    sectionArray.addObjectsFromArray(filteredSet.array) 

Вопрос в том, есть ли способ сделать все это внутри FRC? Поддержание отдельного источника данных из FRC является сложным, и я предпочел бы найти способ сделать это с помощью одного запроса выборки, но я не вижу отличного способа обработки этого.

ответ

1

Нет, группировка должна произойти с ключом на объекте. поэтому используйте свойство переходного процесса или свойство, полученное для получения отношения, и сделайте его ключом

в вашем случае .. например. чтобы все объекты POST имели ключ «postToGroupBy» или «postNameToGroupBy» или что-то еще, так что сообщение и все его дети находятся в одной и той же группе

+0

Как добавление выбранного свойства решает проблему? Единственный способ разрезать результаты FRC - это свойство sectionNameKeyPath, и я не вижу, как то, что вы говорите, будет работать. Можете ли вы привести пример? – smyrgl

+0

BTW, я использую Mogenerator для генерации файлов классов, поэтому отношения уже являются ключами объекта Post. Но я до сих пор не вижу, как я могу сделать их в секциях, используя эти свойства. – smyrgl

+0

отредактировал ответ ... –