iOS核心数据获取请求,如何使用



我使用核心数据来查看用户以前是否看到过表视图中的消息。我这样做的方法是在第一次看到消息Id时将其保存到Core Data,然后在更新表视图时运行一个获取请求,以查看持久内存中是否有具有相同Id的条目。现在,我想知道的是,根据获取请求的耗时,我应该如何最有效地实现它。我应该运行一个请求,在加载视图时将所有保存的消息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。它还将优化获取和内存占用。它是专门为表视图设计的。

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

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

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

这就是它的全部。有了提取的结果控制器,你可以免费获得很多优化,所以我强烈建议你在用核心数据实体填充表视图时使用它。

最新更新