gpt4 book ai didi

ios - NSManagedObjectContext.performBlockAndWait() 在主线程/队列上运行 block

转载 作者:行者123 更新时间:2023-11-28 06:42:24 24 4
gpt4 key购买 nike

print("queue1: \(NSOperationQueue.currentQueue())")
managedObjectContext.performBlockAndWait({
print("queue2: \(NSOperationQueue.currentQueue())")
})

输出为:

queue1: Optional(<NSOperationQueue: 0x7fa31c030cf0>{name = 'NSOperationQueue 0x7fa31c030cf0'})
queue2: Optional(<NSOperationQueue: 0x7fa319d114d0>{name = 'NSOperationQueue Main Queue'})

因此,performBlockAndWait 在主线程中运行 block 。不知道为什么?这是预期的行为吗?

因此,问题的任何解决方案:

  1. 我需要在后台运行该 block 的代码,否则它会卡住 UI。那么,我该怎么做?
  2. 如果我不使用 performBlockAndWait, block 中的代码会崩溃,其描述为 Termating app due to uncaught exception NSInvalidArgumentException, reason _referenceData64 only defined for abstract class。还有其他选择吗?

最佳答案

PerformBlock() 和 performBlockAndWait() 在创建上下文的队列上运行。因此,如果您的 managedObjectContext 在主队列中创建,它将在主队列中运行。

如果你想要后台执行,你需要创建一个后台上下文:

let privateContext = NSManagedObjectContext(
concurrencyType: .PrivateQueueConcurrencyType)

privateContext.persistentStoreCoordinator = mainQueueContext.persistentStoreCoordinator

privateContext.performBlock {
...
}

关于ios - NSManagedObjectContext.performBlockAndWait() 在主线程/队列上运行 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37589775/

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