很多人问过一个类似标题但目的却截然不同的问题:
如果您允许来自其他类的方法调用(默认情况下,每个类都允许), 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 位”。
注意:我对 dispatch_get_current_queue() 的使用似乎是正确且非滥用的,从 Apple 的标题评论来看:重点是我正在检查队列是我创建的私有队列(Apple 声称这是可以接受的用法) .
撇开仅仅因为其实现中存在缺陷而弃用某些东西的智慧:( ...有没有人找到解决方法来解决这个问题被Apple删除。特别是:使用CoreData,您必须跟踪队列-是否有另一种方法可以做到这一点?
(这很重要,因为:使用 CoreData,如果你允许某些东西意外调用这样的方法,你不会得到“崩溃”,你会得到“数据损坏,这将在未来某个时候出现,但为时已晚要解决这个问题”)