我最近一直在实施核心数据框架,实施的每一步都有一个隐藏的问题。
问题就在于我不确定如何解决。
到目前为止,我已经为我的tableview实现了一个保存和获取功能。
首先,fetch返回数据错误,所以我已经实现了
fetchRequest.returnsObjectsAsFaults = false
现在数据被输入并显示在tableview中,但它有大量重复并且处于混乱状态,所以我添加了
fetchRequest.returnsDistinctResults = true
但这不起作用所以谷歌搜索后我实施了以下一个班轮
fetchRequest.resultType = NSFetchRequestResultType.DictionaryResultType
作为最终结果,fetch函数根本不运行。调试器只是跳过操作,应用程序返回一个空的tableview。
这是我的代码。期待任何建议:
func fetchItems() {
// get the managed object context
let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
let managedObjectContext = appDelegate.managedObjectContext!
// create fetch requests
let fetchRequest = NSFetchRequest(entityName:"Entities")
fetchRequest.returnsObjectsAsFaults = false
fetchRequest.returnsDistinctResults = true
fetchRequest.resultType = NSFetchRequestResultType.DictionaryResultType
var fetchedResults : [NSManagedObject]?
do {
fetchedResults = try managedObjectContext.executeFetchRequest(fetchRequest) as? [NSManagedObject]
}
catch {
print("Could not fetch \(error)")
}
if let results = fetchedResults {
someOtherArray = [results]
}
}
答案 0 :(得分:1)
我非常怀疑你想要或需要这些内容:
fetchRequest.returnsObjectsAsFaults = false
fetchRequest.returnsDistinctResults = true
fetchRequest.resultType = NSFetchRequestResultType.DictionaryResultType
第一个主要是性能优化。 "故障"一般来说,这并不是一个值得关注的问题--CoreData通过不填充fetch返回的所有对象的属性值来节省内存。但是,只要您尝试访问其任何属性,它就会自动为每个对象执行此操作。所以这条线很好,但没必要。
关于重复数据,您不应该使用returnsDistinctResults
来抑制它们,您应该避免创建它们。
最后一行是空表视图的原因。因为您指定了DictionaryResultType
,所以fetch返回的数组是一个数组 of dictionaries 。但是这一行:
fetchedResults = try managedObjectContext.executeFetchRequest(fetchRequest) as? [NSManagedObject]
然后您尝试将该数组转换为NSManagedObjects 的数组。该转换失败,因此fetchedResults为零,因此someOtherArray
未设置。
关于混乱顺序,您应该使用排序描述符(请参阅NSSortDescriptor文档)对结果进行排序。
最后,与您的其他问题一样,您将someOtherArray
设置为[results],这是一个包含results
数组的数组。我怀疑你真的想要:
someOtherArray = results