【问题标题】:NSPersistentContainer, performBackgroundTask, calling perform does nothingNSPersistentContainer, performBackgroundTask, 调用 perform 什么都不做
【发布时间】:2019-02-17 06:12:40
【问题描述】:

我刚开始从事一个新项目,我想试试 Core Data 的 NSPersistentContainer,而不是编写自己的堆栈。

我刚刚偶然发现了这个问题,如果该任务是作为NSPersistentContainerperformBackgroundTask 的一部分启动的,那么调用managedObjectContextperform 方法实际上没有任何作用。

这是我目前为演示该问题所做的工作的简要说明。请注意,我有一个DispatchGroup 以确保任务按顺序执行。

// DataImporter.swift
class func importData(url: URL, context: NSManagedObjectContext, completion: () -> ()) {
    context.perform {
        // Code inside here never gets call

        DispatchQueue.main.async(execute: {
            completion()
        })
    }   
}


// ViewController.swift
func multipleImportTasks() {
    persistentContainer.performBackgroundTask { managedObjectContext in
        let group = DispatchGroup()

        group.enter()
        let fileUrl1 = Data(someData)
        DataImporter.importData(fileUrl1, context: managedObjectContext, completion: {
            group.leave()
        })

        group.wait()
        group.enter()
        let fileUrl2 = Data(someData)
        DataImporter.importData(fileUrl2, context: managedObjectContext, completion: {
            group.leave()
        })

        group.notify(queue: DispatchQueue.main, execute: {
            print("all done")
        })
    }
}

【问题讨论】:

    标签: core-data grand-central-dispatch nspersistentcontainer


    【解决方案1】:

    这是因为group.wait() 来电。 group.wait() 会阻塞当前线程并且 context.perform 也会尝试在同一个线程上运行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-17
      • 2017-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多