在 Core Data 中获取数据时的 performBackgroundTask 故障错误

Posted

技术标签:

【中文标题】在 Core Data 中获取数据时的 performBackgroundTask 故障错误【英文标题】:performBackgroundTask Fault Error when fetching data in Core Data 【发布时间】:2018-09-09 15:52:23 【问题描述】:

我遇到了一个奇怪的问题: 我正在使用 backgroundFetch 从 Core Data 中获取数据。

func fetchDataFromCoreData(completion:@escaping()->Void)
    
        let appdel = UIApplication.shared.delegate as! AppDelegate
        let context = appdel.persistentContainer.viewContext

        appdel.persistentContainer.performBackgroundTask  (context) in

        let fetchReq = NSFetchRequest<NSFetchRequestResult>(entityName: "FreeApps")
        do
        
                let data = try context.fetch(fetchReq) as? [NSManagedObject]
            self.resultData = data
            print(self.resultData ?? "data is empty")
            DispatchQueue.main.async
            completion()
            
        

        catch
        
            print("fetch error")
        
       

    

现在在我的视图控制器中,在我的表格单元格中:

  let myDict = itunesViewModelObj.resultData?[indexPath.row] as? NSManagedObject
        print(myDict?.value(forKey: "name") as? String ?? "no name")myDict shows as fault but valefor key comes nil

现在,如果我评论 performBackgroundTask 行数据正确。

请帮助解决 backgroundTask 的问题。 任何建议将不胜感激! 提前致谢!

【问题讨论】:

你确定你已经使用了正确的上下文吗? 【参考方案1】:

PersistentContainer 在主队列上运行。正如该属性的名称所暗示的,此托管对象上下文旨在与应用程序的用户界面结合使用。也许您需要调度回主队列以与 UIApplicationDelegate 和 PersistentContainer 进行交互。 PerformBackgroundTask 通常用于更新核心数据。如果你在做 fetches,你应该使用主 viewContext。 也许使用...

DispatchQueue.main.async

// 你的代码

【讨论】:

以上是关于在 Core Data 中获取数据时的 performBackgroundTask 故障错误的主要内容,如果未能解决你的问题,请参考以下文章

多上下文麻烦。无法在 Core Data 中创建两个队列(主队列和私有队列)保存数据

在 Core Data 中的相关实体之间传递数据时的空值

使用 Core Data 时的模型实例化问题

有两个相同模型版本时的 Core Data 迁移

在 Core Data 中加载具有关系的托管对象时的标准行为是啥?

我可以在 Core Data 中获取关系数据吗