提示:通过读写器访问提高性能
• 使用并发子系统队列
- DISPATCH_QUEUE_CONCURRENT
• 使用同步并发“读取”</p>
• 使用异步序列化“写入”</p>
例子:
// ...
_someManagerQueue = dispatch_queue_create("SomeManager", DISPATCH_QUEUE_CONCURRENT);
// ...
您可以在 init 上创建队列,为 nib 唤醒等...如果可以在同一实例中多次调用该函数,请使用 dispatch_once。
然后:
- (id) getSomeArrayItem:(NSUInteger) index {
id importantObj = NULL;
dispatch_sync(_someManagerQueue,^{
id importantObj = [_importantArray objectAtIndex:index];
});
return importantObj;
}
- (void) removeSomeArrayItem:(id) object {
dispatch_barrier_async(_someManagerQueue,^{
[_importantArray removeObject:object];
});
}
- (void) addSomeArrayItem:(id) object {
dispatch_barrier_async(_someManagerQueue,^{
[_importantArray addObject:object];
});
}
这样,您就可以确保每当您读取信息(例如数组)时,所有“更改”都已完成或正在“等待”。而且每次你写一个信息,你的程序也不会被阻塞等待操作完成。
您可以使用串行队列,但是这会浪费大量的处理时间,而且时间不会使读数并行化。这样,如果您使用多个线程,则除非它是“写入”,否则没有人必须等待另一个线程,这是正确的。
更多信息:WWDC 2012 会议 712