我知道可以使用障碍解决GCD中的读写器问题。由于我(通常)在性能不是关键问题时尝试使用NSOperationQueue
而不是GCD,因此我希望NSOperation
兼容此问题的解决方案。
我已经尝试过写自己的,但我的解决方案变得笨拙......当然有人已经解决了这个问题吗?
是否有人知道NSOperation
- 兼容读写器问题的解决方案?
答案 0 :(得分:1)
与大多数NSOperationQueue
hackery一样,您可以利用其对操作之间依赖关系的支持:
NSBlockOperation
子类ReaderWriterBlockOperation
。添加属性BOOL writer
。-readWithBlock:
和-writeWithBlock:
。两者都会ReaderWriterBlockOperation
,writer == NO
,== YES
。他们的操作管理依赖关系如下:
-readWithBlock:
在@synchronized(self)
块中执行从上一次到第一次查找写入程序块的操作的扫描。如果没有找到,则添加操作并返回。如果找到一个,它会使新的阅读器块依赖于编写器,将其排队并返回。-writeWithBlock:
做同样的事情。除非在排队操作中找不到编写器,否则它将使该块依赖于找到的所有读取器。如果在排队操作中找到一个,它将使自己依赖于该操作和所有后续(读取器)操作。这应该会阻止所有读者,直到他们面前的作者完成,并阻止所有作者直到他们完成之前的读者。
一个可能的问题:我不清楚(因为文档不清楚,我还没有这样做)如果NSBlockOperation
实际等待其块完成运行,然后才宣告自己完成。如果没有,您需要在您的操作子类中自行管理。
所有这一切,如果系统提供工作解决方案,如障碍块,你应该使用它。整个系统是一个黑客,可以让一个操作队列做一些调度队列调整好处理的东西。如果性能实际上不是问题,那么为什么不使用串行队列(NSOperationQueue
最大并发操作次数== 1)?