【发布时间】:2019-11-30 11:21:07
【问题描述】:
我有一个简化为这样的数据结构:
所以一个文件夹可以包含多个文件夹或sn-ps,每个sn-p都是一个文件夹的一部分。 我想获取给定文件夹中或特定文件夹子文件夹中的所有片段。
第一种情况适合我,但我无法正确处理第二种情况。
为了更清楚,这里举个例子:
当我选择文件夹 C 时,我想获取 Snippet 3,但当我选择文件夹 B 或文件夹 A 时,我想获取 Snippet 1、Snippet 2 和 Snippet 3。
这是我目前拥有的:
class Store {
...
func snippetsFetchRequest() -> NSFetchRequest<Snippet> {
let fetch: NSFetchRequest<Snippet> = Snippet.fetchRequest()
fetch.returnsObjectsAsFaults = false
fetch.relationshipKeyPathsForPrefetching = ["folder", "tags"]
fetch.sortDescriptors = [NSSortDescriptor(key: "updateDate", ascending: false)]
return fetch
}
...
}
let context = PersistenceManager.shared.mainContext
let store = SnippetStore(context: context)
fetchedResultsController = NSFetchedResultsController(fetchRequest: store.snippetsFetchRequest(),
managedObjectContext: context,
sectionNameKeyPath: nil,
cacheName: nil)
fetchedResultsController.fetchRequest.predicate = NSPredicate(format: "folder == %@", selectedFolder)
do {
try fetchedResultsController.performFetch()
} catch {
...
}
但这只会获取作为给定/选定文件夹的直接子级的 sn-ps。
我有什么办法可以通过仍然使用NSFetchedResultsController来解决我的问题?
【问题讨论】:
-
这看起来有点像复合设计模式,你可以在代码中解决这个问题,方法是使用一个方法
allSnippets获取snippets并将其与调用allSnippets的所有结果合并children -
是的,我也这么认为。我想我可以通过获取所有 sn-ps 然后应用一些过滤器逻辑来解决它,分别遍历孩子。但是我问自己 NSPredicates 是否有一些内置功能。 NSFetchedResultsController 或通过更新我可以使用的底层模型架构,而不是删除我的 FetchedResultsController 并自己实现逻辑。
-
我现在看到我忘了说
allSnippets应该是Folder类中的一个方法。 -
当然,我已经在可以利用的文件夹上建立了 sn-ps 关系。我想如果表达这种 FetchRequest 没有聪明的方法,这将是要走的路。