iOS Core Data Fetch Request,如何使用

iOS Core Data Fetch Request, how to use

我正在使用 Core Data 查看 table 视图中的消息是否已被用户看到。我这样做的方法是在第一次看到消息 Id 时将其保存到 Core Data,然后我 运行 在更新 table 视图时进行提取请求以查看是否有条目具有相同 ID 的持久内存。 现在我想知道的是,根据请求的耗时,我应该如何最有效地实现我的提取请求。我是否应该 运行 请求 returns 在加载视图时将所有消息 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

}

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

首先,请查看 Xcode 模板(Master/Detail,检查核心数据)。这真的很简单。

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

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

仅此而已。使用 fetched results controller,你可以免费获得很多优化,所以我强烈建议你在使用 Core Data 实体填充 table 视图时使用它。