NSPersistentContainer, executeBackgroundTask, вызов execute ничего не делает - PullRequest
0 голосов
/ 17 февраля 2019

Я только начал работать над новым проектом и решил попробовать Core Data NSPersistentContainer вместо того, чтобы писать свой собственный стек.

Я только что наткнулся на эту проблему, когда вызов perform метода managedObjectContext фактически ничего не делает, если задача была запущена как часть NSPersistentContainer performBackgroundTask.

Вот фрагмент того, что я сейчас делаю, чтобы продемонстрировать проблему.Обратите внимание, что у меня есть 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")
        })
    }
}

1 Ответ

0 голосов
/ 12 апреля 2019

Это из-за group.wait() звонка.group.wait() заблокирует текущий поток, а context.perform также попытается запустить его в том же потоке.

...