gpt4 book ai didi

ios - dispatch_get_current_queue() 已弃用,是否有安全 CoreData 的替代方案?

转载 作者:可可西里 更新时间:2023-11-01 03:56:07 32 4
gpt4 key购买 nike

许多人问过一个标题相似但目的却截然不同的问题:

CoreData 要求您跟踪当前队列、当前线程和当前 NSOperationQueue(如果您是 NSOperation),如果您允许方法调用来自其他类(这,默认情况下,每个类都允许)。没有关于此的“可能”:这是一个硬性要求。

这很好,而且通常很容易确保:

NSAssert( [NSThread currentThread].isMainThread || myPrivateQueue == dispatch_get_current_queue(), @"You tried to call this method from an external thread, or a queue other than my internal private queue. That's not legal, and will cause data corruption" );

...除了 Apple 已经弃用了 dispatch_get_current_queue(),显然“因为人们滥用它来绕过 GCD 中缺失的功能/他们不理解的 GCD 部分”。

注意:从 Apple 的标题评论来看,我上面对 dispatch_get_current_queue() 的使用似乎是正确且没有滥用的:重点是我正在检查队列是否是我创建的私有(private)队列(Apple 声称是可接受的用法)。

撇开仅仅因为其实现中的缺陷而弃用某些东西的智慧 :( ... 有没有人找到解决方法来解决这个被 Apple 删除的问题。具体来说:使用 CoreData,你必须跟踪队列 - 还有另一种方法吗这样做?

(这很重要,因为:对于 CoreData,如果你允许某些东西意外地调用这样的方法,你不会得到“崩溃”,你会得到“数据损坏,这将在未来的某个时候出现现在修复它已经太晚了”)

最佳答案

performBlock 始终在正确的线程中运行它。只需使用:

[yourManagedObjectContext performBlock:^{
//do your stuff here
}];

您不再需要跟踪当前上下文,因为您的 MOC 知道首先触发此 MOC 的线程。当您使用 performBlockperformBlockAndWait 时,您是安全的。

关于ios - dispatch_get_current_queue() 已弃用,是否有安全 CoreData 的替代方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18510923/

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