11

我第一次开始控制队列,感觉我对如何使用它们有了很好的掌握,并感谢 Apple 让它们非常易于使用。

然而,我遇到的是多个线程读取和写入相同对象的挑战。在这个问题中,我得到了这个很好的答案@synchronized,这让我要求大家确认一下,以确保我了解vs的优缺点GCD dispatch_barrier_async

这是我的看法:

 @synchronized

PRO@synchronized :只要您有访问/指向它的指针,您就可以包装任何对象,从而可以轻松地从程序中的不同对象安全地处理共享数据模型

PRO:受 iOS 4 支持(可能更早)

 `dispatch_barrier_async` with custom DISPATCH_QUEUE_CONCURRENT

PRO : 比 @synchronized 快

CON:DISPATCH_QUEUE_CONCURRENT 仅在 iOS 5 中可用(如此所述),因此不适用于支持 iOS 4

CON:在控制来自许多其他对象的对象的读/写时不太容易使用,因为队列最容易仅对创建它们的对象可用(无需做一些工作来绕过这个限制)

总之,考虑到上述情况,最好的工具取决于程序的需要。

如果有人有什么要补充或指出的,我将不胜感激。

4

1 回答 1

4

嗯,有几点需要指出:

1) 当您使用@synchronized 时,它会为应用程序引入 iOS(或 OSX)的整个异常框架。我在 OSX 上知道这一点,它在那里对性能有影响,在 iOS 上不能肯定地说,但会期望相同。也就是说,这是使用大锤敲击钉子——在其他选项可用之前,这种能力就已经存在。我个人避免像瘟疫一样使用它,并移植了其他开源框架来使用调度信号量(我再次感谢 Mike Ash!)

2)您对“DISPATCH_QUEUE_CONCURRENT”的评论是一种红鲱鱼 - 由于 iOS 4 系统为您提供了 3 个并发队列,因此如果您需要定义自己的队列,您真的是在挑战极限。使用调度,您可以拥有异步和同步、串行和并发组,您可以等待,然后调度。这里有这么丰富的东西,你怎么能想到1)。您使用块的次数越多,您将使用它们的次数越多!

编辑:我在我的 iOS 4.3 应用程序中使用了自定义并发队列,以及所有 Mike Ash 屏障技术。queue.h 文件将其显示为可用:

__OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_4_0)
DISPATCH_EXPORT DISPATCH_CONST DISPATCH_WARN_RESULT DISPATCH_NOTHROW
dispatch_queue_t
dispatch_get_global_queue(dispatch_queue_priority_t priority, unsigned long flags);

/*!
 * @const DISPATCH_QUEUE_SERIAL
 * @discussion A dispatch queue that invokes blocks serially in FIFO order.
 */
#define DISPATCH_QUEUE_SERIAL NULL

/*!
 * @const DISPATCH_QUEUE_CONCURRENT
 * @discussion A dispatch queue that may invoke blocks concurrently and supports
 * barrier blocks submitted with the dispatch barrier API.
 */
#define DISPATCH_QUEUE_CONCURRENT (&_dispatch_queue_attr_concurrent)
于 2012-08-12T23:20:19.860 回答