liv*_*ech 7 objective-c grand-central-dispatch ios
本质上,我有一组数据NSDictionary,但为方便起见,我设置了一些NSArrays,数据以几种不同的方式排序和过滤.数据将通过不同的线程(块)进入,我想确保一次只有一个块修改我的数据存储.
今天下午我遇到了设置调度队列的麻烦,随后偶然发现了一个关于@synchronized这个问题的帖子,这看起来几乎就像我想做的那样.
所以我现在拥有的是......
// a property on my object
@property (assign) dispatch_queue_t matchSortingQueue;
// in my object init
_sortingQueue = dispatch_queue_create("com.asdf.matchSortingQueue", NULL);
// then later...
- (void)sortArrayIntoLocalStore:(NSArray*)matches
{
dispatch_async(_sortingQueue, ^{
// do stuff...
});
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,我可以用以下内容替换所有这些吗?
- (void)sortArrayIntoLocalStore:(NSArray*)matches
{
@synchronized (self) {
// do stuff...
};
}
Run Code Online (Sandbox Code Playgroud)
......无论如何,两者之间有什么区别?我应该考虑什么?
虽然功能上的差异对你来说可能并不重要,但这是你所期望的:如果你@synchronize那么你所在的线程被阻塞,直到它可以获得独占执行.如果异步调度到一个串行调度队列,那么调用线程可以继续使用其他东西,无论你实际在做什么,它总是会出现在同一个已知队列中.
因此,它们等同于确保一次仅从一个队列使用第三个资源.
例如,如果您有一个资源可以通过主队列中的用户界面访问并且您想要改变它,那么调度可能是一个更好的主意.然后,您的用户界面代码不需要显式@synchronize,隐藏在对象中的线程方案的复杂性非常自然.如果你有一个可以在其他不同角色上触发其中一些变化的中央演员,调度也会更好.这将允许他们同时运作.
同步更紧凑,更容易进行调试.如果您正在做的事情往往是两三行而且您需要同步调度它,那么感觉创建队列的努力是不值得的 - 特别是当您考虑创建的隐含成本时一个块并将其移动到堆上.
| 归档时间: |
|
| 查看次数: |
7657 次 |
| 最近记录: |