核心数据跳过获取函数Swift

时间:2015-09-11 07:27:08

标签: ios swift uitableview core-data

我最近一直在实施核心数据框架,实施的每一步都有一个隐藏的问题。 问题就在于我不确定如何解决。
到目前为止,我已经为我的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]
    }
}

1 个答案:

答案 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