objective-c - 避免复制 NSMutableArray 以使用多线程写入进行读取

标签 objective-c cocoa-touch concurrency nsmutablearray

我有一个使用可变数组的类,该数组在大量读取(新项目到达)后修改一次。

问题是,当需要改变数组时,读取会不断涌现。

目前,为了避免每次读取它在副本上执行的操作时出现此问题:

[[theArray copy] operation] //operation being indexOfObject:, objectAtIndex: objectsAtIndexes:, etc.

副本变得非常昂贵,尤其是在没有必要的时候(所有这些时候数组没有被改变)。

如何在数组发生变化时锁定数组以延迟对它的访问?

最佳答案

将所有数组访问放到一个串行调度队列中。这将防止任何两个操作同时发生。参见 "Eliminating Lock-based Code"在并发编程指南中。

如果你可以要求 iOS >= 4.3,你可以使用并发自定义队列和 dispatch barriers用于突变操作。这将允许读取同时发生,但是当需要写入时,它们将被暂停直到写入完成。作为屏障提交的 block 本质上是在并发队列上串行执行——直到所有先前的 block 都完成后它才会开始,任何后续 block 也不会在屏障 block 完成之前开始。 (这是 Justin 提到的读写锁的 GCD 版本。)我将您引向无与伦比的 Mike Ash samples of this。 .

关于objective-c - 避免复制 NSMutableArray 以使用多线程写入进行读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11890522/

相关文章:

java - 结构如何正确通知其他线程有关事件的信息?

ruby-on-rails - Rails 3.2 ActiveRecord 并发

iphone - 如何以非阻塞延迟执行多个操作?

ios - 使用返回的 JSON 值设置 NSString

objective-c - 在 iPad (phonegap) 应用程序上禁用 "Notification Center"

ios - 从 CoreData 实体中的 NSNumber 获取 intValue 时,无法识别的选择器崩溃

ios - 将 Storyboard中的多个 View Controller 连接到 Xcode 6 中的代码

ios - 从 UI BarButtonSystemItem 图标获取图像

cocoa-touch - 文件所有者到底是什么意思?

Java:线程中的 `while (true) { ... }` 循环不好吗?有什么选择?