Поскольку 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.