为什么我应该使用 NSManagedObjectContext 的 Perform() 和 PerformAndWait() 而我可以使用 DispatchQueue.global

问题描述 投票:0回答:1

我对在后台队列上运行 CoreData 代码有些困惑。

我们可以使用一些方法使用 NSManagedObjectContext 在后台线程上执行 CoreData 代码。

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*/ 
}
swift xcode core-data nsmanagedobjectcontext dispatch-queue
1个回答
5
投票

因为 performperformAndWait 保证您将在创建对象的上下文中访问对象。

假设您有两个上下文。

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

通过使用 performperformAndWait,您可以保证它们在创建的队列中执行。否则,你将会遇到并发问题。

所以你可以得到下面的行为。

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 文档的链接

© www.soinside.com 2019 - 2024. All rights reserved.