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

时间:2015-04-03 21:45:20

标签: ios objective-c swift core-data nsfetchrequest

我正在使用Core Data来查看用户之前是否看到过表格视图中的消息。我这样做的方法是在第一次看到时将消息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

}

1 个答案:

答案 0 :(得分:0)

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

要开始使用,请查看Xcode模板(主/详细信息,检查核心数据)。这真的很简单。

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

据推测,每个表视图单元格都代表LogItem(NSManagedObject子类),其中包含一个指示read状态的属性。更改后,委托方法将尝试根据索引路径更新它。

这就是它的全部内容。使用获取的结果控制器,您可以免费获得大量优化,因此我强烈建议您在使用Core Data实体填充表视图时使用它。