在GCD中,有没有办法判断当前队列是否并发? 我当前正试图在某些托管对象上下文中执行延迟保存,但我需要确保代码当前执行的队列是线程安全的(在同步队列中)。
答案 0 :(得分:4)
如果您确实需要确定传入给您的队列是串行还是并发,那么您几乎肯定会设计错误的东西。通常,API会将内部队列隐藏为实现细节(在您的情况下,您的共享对象上下文),然后将操作嵌入其内部队列以实现线程安全。但是,当您的API将块和队列作为参数时,则假设传入的块可以安全地调度(异步)针对传递的队列(例如,当操作完成时)和其余的代码被适当考虑。
答案 1 :(得分:-1)
是的,假设您正在NSOperation子类中进行工作:
[myOperation isConcurrent] //or self, if you're actually in the NSOperation
如果需要确保某些操作始终同步执行,则可以创建特定的操作队列并将其最大并发操作数设置为1.
NSOperationQueue * synchronousQueue = [[NSOperationQueue alloc] init];
[synchronousQueue setMaxConcurrentOperationCount:1];
GCD提前做好一些规划。我能想到的另一种方法是在isExecuting
个对象上观察值NSOperation
(或类似)。查看this reference。这个解决方案会更复杂,所以我希望另一个解决方案适合你。