我正在使用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
}
答案 0 :(得分:0)
最好的方法是使用NSFetchedResultsController
。它还将优化读取和内存占用。它专为桌面视图而设计。
要开始使用,请查看Xcode模板(主/详细信息,检查核心数据)。这真的很简单。
确保您还实现了委托方法 - 当托管对象发生更改时,它们将自动被调用,因此只有最少的代码才能更新UI(仅当对象实际位于屏幕上时才会执行)。
据推测,每个表视图单元格都代表LogItem
(NSManagedObject子类),其中包含一个指示read
状态的属性。更改后,委托方法将尝试根据索引路径更新它。
这就是它的全部内容。使用获取的结果控制器,您可以免费获得大量优化,因此我强烈建议您在使用Core Data实体填充表视图时使用它。