微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

objective-c – 用NSOperationQueue解决读写器问题?

我知道有可能使用障碍解决GCD中的读者作家问题.由于我(通常)尝试在性能不是关键问题时使用NSOperationQueue而不是GCD,所以我想要一个NSOperation兼容的解决方案来解决这个问题.

我试图写我自己的,但是我的解决方案变得笨拙…肯定有人已经解决了这个问题?

有没有人知道与读写器问题的NSOperation兼容的解决方案?

解决方法

与大多数NSOperationQueue Hackery一样,您可以利用其对操作之间的依赖关系的支持

>创建NSBlockOperation子类ReaderWriterBlockOperation.添加到它的属性BOOL作家.
>每个受保护的资源创建一个操作队列.
>停止将您的操作队列暴露给客户端.而是暴露API -readWithBlock:和-writeWithBlock :.两个入门一个ReaderWriterBlockOperation,一个与writer == NO,另一个== YES.他们的操作管理依赖关系如下:

> -readWithBlock:在@synchronized(self)块中,执行从最后到第一个操作的扫描查找写入程序块.如果没有找到,它会添加操作并返回.如果找到它,则使新的读取器块依赖于作者,排列它并返回.
> -writeWithBlock:做同样的事情.除非在排队操作中没有找到作者,否则这将阻止所有读者找到.如果在排队操作中找到一个,则它依赖于该操作以及所有以下(读取器)操作.

这应该是阻止所有读者的结果,直到作者完成之前,阻止所有作家,直到读者完成之前.

一个可能的问题:我不清楚(因为文档不清楚,我还没有实现这一点)如果NSBlockOperation实际上等待其块完成运行,然后声明自己完成.如果没有,您需要在您的操作子类中管理自己.

所有这一切,如果系统提供了一个工作的解决方案,如障碍块,你应该使用它.这个整个系统是一个操作队列来执行调度队列已经被调整得很好的事情.如果性能实际上不是一个问题,那么为什么不使用串行队列(NSOperationQueue,最大并发操作数为== 1)?

原文地址:https://www.jb51.cc/c/112389.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐