Почему я должен использовать NSManagedObjectContext's execute () и executeAndWait (), в то время как я могу использовать DispatchQueue.global - PullRequest
0 голосов
/ 28 июня 2019

У меня возникли некоторые сомнения по поводу запуска кода CoreData в фоновой очереди.

Существует несколько методов, которые мы можем использовать для выполнения кода CoreData в фоновом потоке, используя NSManagedObjectContext.

viewContext.perform { /*some code will run on the background thread*/ }
viewContext.performAndWait{ /*some code will run on the background thread*/ }

Мой вопрос здесь, почему я должен использовать эти функции, а не обычным способом для запуска некоторого кода в фоновом потоке, используя DispatchQueue

DispatchQueue.global(qos: .background).async { 
     /*some code will run on the background thread*/ 
}

1 Ответ

0 голосов
/ 07 июля 2019

Поскольку execute и executeAndWait являются потокобезопасными.

Допустим, у вас есть два контекста.

let privateContext = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType)
let mainContext = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)

Используя execute или executeAndWait , вы гарантируете, что они будут выполнены в очереди, в которой они были созданы. В противном случае у вас будут проблемы с параллелизмом.

Так что вы можете получить поведение ниже.

DispatchQueue.global(qos: .background).async {
        //some code will run on the background thread
        privateContext.perform {
            //some code will run on the private queue
            mainContext.perform {
                //some code will run on the main queue
            }
        }
    }

В противном случае все они будут выполняться в фоновом режиме, как указано в следующем коде.

DispatchQueue.global(qos: .background).async {
        //some code will run on the background thread
            do {
                //some code will run on the background thread
                try privateContext.save()
                do {
                    //some code will run on the background thread
                    try mainContext.save()
                } catch {
                    return
                }
            } catch {
                return
            }
        }

Чтобы узнать больше о параллелизме, здесь есть ссылка на документацию Apple.

...