iOS Core Data Fetch Request,如何使用

Posted

技术标签:

【中文标题】iOS Core Data Fetch Request,如何使用【英文标题】:iOS Core Data Fetch Request, how to use 【发布时间】:2015-04-03 21:45:20 【问题描述】:

我正在使用 Core Data 来查看用户之前是否看过表格视图中的消息。我这样做的方法是在第一次看到消息 Id 时将其保存到 Core Data,然后在更新表视图时运行获取请求以查看持久内存中是否存在具有相同 Id 的条目。 现在我想知道的是我应该如何最有效地实现我的 fetch 请求,这取决于它的耗时程度。我应该运行一个请求,在加载视图时将所有已保存的消息 Id 作为数组返回,然后在cellForRowAtIndexPath检查该数组是否包含该单元格的消息 Id,还是使用cellForRowAtIndexPath 中的谓词运行获取请求?后者将是我的首选方法,但如果我有 100 个左右的细胞,我想知道这是否是一种糟糕的礼仪。 任何帮助将不胜感激。

这是我的获取请求:

func persistQuery(predicateValueString: String!) -> Bool! 

let fetchRequest = NSFetchRequest(entityName: "LogItem")
let predicate = NSPredicate(format: "itemText == %@", predicateValueString)

fetchRequest.predicate = predicate

var didFindResult = true

if let fetchResults = managedObjectContext!.executeFetchRequest(fetchRequest, error: nil) as? [LogItem] 

    if fetchResults.count == 0 
        didFindResult=false
    


return didFindResult

【问题讨论】:

尝试两个选项并分析它们以查看哪个最好(通常不要担心,除非您在预期条件下进行测试时发现问题) 【参考方案1】:

最好的方法是使用NSFetchedResultsController。它还将优化获取和内存占用。它专为表格视图而设计。

要开始使用,请查看 Xcode 模板(Master/Detail,检查 Core Data)。这真的很简单。

确保您还实现了委托方法 - 当您的托管对象发生更改时,它们将被自动调用,因此只需执行最少的代码即可更新 UI(仅当对象实际在屏幕上时)。

大概每个表格视图单元格都代表一个LogItem(NSManagedObject 子类),其属性指示read 状态。更改后,委托方法将尝试根据索引路径对其进行更新。

仅此而已。使用 fetched results 控制器,您可以免费获得很多优化,因此我强烈建议您在使用 Core Data 实体填充表视图时使用它。

【讨论】:

感谢您的帮助,但我实际上并没有使用存储的数据来填充表格。数据源来自我们的后端,但为了保持服务器请求较低,我在设备本身上存储了读取状态 我明白了。您绝对应该将要显示的数据存储在设备中,而不仅仅是存储在内存中。上述方案是合适的。无论如何,您都要解析消息的整个文本。也许如果你只有 ids 你可以减少它,但如果你可以在本地保存数据,UX 很可能会更好。

以上是关于iOS Core Data Fetch Request,如何使用的主要内容,如果未能解决你的问题,请参考以下文章

Fetch on Core Data 可以在模拟器上运行,但不能在设备上运行

iOS Core Data 对多关系插入/获取

Core data multithreading fetch record

Core Data Fetch 没有返回它应该返回的对象

Core Data Freeze at fetch request(死锁)

Core Data Fetch 在插入实体时保存关系(同时)