gpt4 book ai didi

iphone - NSManagedObjectContext 的 performBlockAndWait : not executing on the receiver's queue

转载 作者:可可西里 更新时间:2023-11-01 05:44:50 26 4
gpt4 key购买 nike

我注意到,对于 NSManagedObjectContextNSMainQueueConcurrencyType 来说,performBlockAndWait 是可能的:并在除接收者的(主)队列。

例如,如果我的 parentContext 是类型 NSMainQueueConcurrencyType 和我的 childContextNSPrivateQueueConcurrencyType 类型:

[childContext performBlockAndWait:^{
//Thread 1, Queue: NSManagedObjectContext Queue
[parentContext performBlockAndWait:^{
//Thread 1, Queue: NSManagedObjectContext Queue
//This is the same queue as the child context's queue
}];
}];

相比之下,以下代码按预期工作——我的 parentContext 执行主队列上的 block :

[childContext performBlock:^{
[parentContext performBlockAndWait:^{
//Thread 1, Queue: com.apple.main-thread
}];
}];

这是预期的行为吗?这肯定让我感到困惑,因为文档声明 “performBlockAndWait:同步执行接收者队列上的给定 block 。”

最佳答案

您不必担心执行了哪些线程 block 。 performBlock:performBlockAndWait: 方法保证的是线程安全。因此,从主线程调用 performBlockAndWait: 并不意味着上下文会切换到后台线程 - 它非常昂贵并且不需要。如果在 block 的操作期间(在主线程上),尝试执行一个 block ,它将被阻塞,直到当前正在执行的 block 完成。在一天结束时,结果将与执行上下文切换一样,只是速度更快。另一方面,调用 performBlock: 会将 block 放入任意队列,通常在后台线程上执行。

在上面的例子中,因为你performBlockAndWait:,你的私有(private)队列上下文在主线程上执行你的 block ,主上下文 block 也是如此。在第二个示例中,您将 block 安排为异步运行,因此它在后台线程上执行。

你不应该根据名字来判断一个线程的队列。要查看您是否在主队列中,可以使用 dispatch_get_current_queue() 并测试它是否等于 dispatch_get_main_queue()

关于iphone - NSManagedObjectContext 的 performBlockAndWait : not executing on the receiver's queue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19439141/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com