Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios CoreData中的递归获取_Ios_Swift_Core Data - Fatal编程技术网

Ios CoreData中的递归获取

Ios CoreData中的递归获取,ios,swift,core-data,Ios,Swift,Core Data,我将数据结构简化为: 因此,一个文件夹可以包含多个文件夹或代码段,而每个代码段都是文件夹的一部分。 我想获取给定文件夹中的所有代码片段,或者获取特定文件夹的子文件夹中的所有代码片段 第一个案例对我来说很有效,但我在正确处理第二个案例时遇到了问题 为了更清楚地说明这一点,以下是一个示例: 当我选择文件夹C时,我希望得到代码段3,但当我选择文件夹B或文件夹A时,我希望得到代码段1、代码段2和代码段3 这就是我目前拥有的: class Store { ... func snippetsFe

我将数据结构简化为:

因此,一个文件夹可以包含多个文件夹或代码段,而每个代码段都是文件夹的一部分。 我想获取给定文件夹中的所有代码片段,或者获取特定文件夹的子文件夹中的所有代码片段

第一个案例对我来说很有效,但我在正确处理第二个案例时遇到了问题

为了更清楚地说明这一点,以下是一个示例:

当我选择文件夹C时,我希望得到代码段3,但当我选择文件夹B或文件夹A时,我希望得到代码段1、代码段2和代码段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 {
    ...
}
类存储{
...
func snippetsFetchRequest()->NSFetchRequest{
let fetch:NSFetchRequest=Snippet.fetchRequest()
fetch.returnsObjectsAsFaults=false
fetch.relationshipkypathsforprefetching=[“文件夹”,“标记”]
fetch.sortDescriptors=[NSSortDescriptor(键:“updateDate”,升序:false)]
回传
}
...
}
让context=PersistenceManager.shared.mainContext
let store=SnippetStore(上下文:context)
fetchedResultsController=NSFetchedResultsController(fetchRequest:store.snippetsFetchRequest(),
managedObjectContext:context,
sectionNameKeyPath:nil,
缓存名称:nil)
fetchedResultsController.fetchRequest.predicate=NSPredicate(格式:“文件夹==%@”,selectedFolder)
做{
请尝试fetchedResultsController.performFetch()
}抓住{
...
}
但这只获取作为给定/选定文件夹的直接子级的代码段


是否有任何方法可以通过仍然使用NSFetchedResultsController解决我的问题?

您的数据结构错误。人们倾向于认为数据结构器对给定的信息有一个“正确的”;你要尽可能地“模拟”现实。这是错误的。您的模型只有在为您的特定应用程序提供价值时才有价值


在这种情况下,如果要获取文件夹的所有死者,最好建立一个表示该死者的关系。您可以建立死者和祖先的多对多关系,可以在添加对象时设置这些关系。如果需要更多属性进行筛选或排序,则应该添加它们,即使这些属性理论上可以从当前树模型派生。只需确保它们保持同步。

这看起来有点像复合设计模式,您可以在代码中通过使用一个方法
allSnippets
来解决这个问题,该方法获取
snippets
,并将其与对所有
子对象调用
allSnippets
的结果合并。是的,我也这么认为。我想我可以通过获取所有代码片段,然后应用一些过滤逻辑,分别遍历子代码来解决这个问题。然而,我问自己NSPredicates是否有一些内置功能。NSFetchedResultsController,或者通过更新我可以使用的底层模型体系结构,而不是删除我的FetchedResultsController并自己实现逻辑。我现在明白了,我忘了说
所有片段
应该是
文件夹中的一个方法。当然,我已经在文件夹上建立了代码片段关系,我可以利用它。我想,如果没有聪明的方法来表达这种请求,这将是一种方式。