许多人都提出了一个类似的问题,但目的却大不相同: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" );
除了苹果公司已经弃用dispatch_get_current_queue()之外,显然是“因为人们滥用它来绕过GCD中缺失的功能/他们不理解的GCD部分”。
注:根据苹果的头部注释,我上面使用的dispatch_get_current_queue()似乎是正确且非滥用的:整个重点是我正在检查队列是否是我创建的私有队列(苹果声称这是可接受的用法)。
撇开仅因其实现中存在缺陷而废弃某些东西的智慧 :( ...有没有人找到了苹果公司删除它的解决方法。特别是:对于CoreData,您必须跟踪队列-还有其他方法可以做到这一点吗?
(这很重要,因为:对于CoreData,如果允许某些东西意外调用这样的方法,您将不会得到“崩溃”,而是会得到“数据损坏”,这将在未来的某个时候显示出来,当时已经太迟修复它)
dispatch_queue_set_specific()
和dispatch_get_specific()
,用于我在这里提出的应用程序:https://dev59.com/J2cs5IYBdhLWcg3wfEHa,并且已经成功地识别了特定队列。答案中Jody的评论提到了在Core Data中使用类似的东西。 - Brad Larsondispatch_get_current_queue()
已经被弃用,因为API的设计有缺陷,而不是实现有问题。你应该使用dispatch_get_specific()
作为替代功能。请注意,这是为了满足你的使用需求。 - das