gpt4 book ai didi

ios - @synchronized block 与 GCD dispatch_async()

转载 作者:可可西里 更新时间:2023-11-01 03:29:39 27 4
gpt4 key购买 nike

本质上,我在 NSDictionary 中有一组数据,但为了方便起见,我设置了一些 NSArray,其中的数据按不同的方式排序和过滤方法。数据将通过不同的线程( block )传入,我想确保一次只有一个 block 修改我的数据存储。

今天下午我经历了设置调度队列的麻烦,然后偶然发现了一篇关于 @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...
});
}

我的问题是,我可以用以下内容替换所有这些吗?

- (void)sortArrayIntoLocalStore:(NSArray*)matches
{
@synchronized (self) {
// do stuff...
};
}

...这两者到底有什么区别?我应该考虑什么?

最佳答案

虽然功能上的差异对您来说可能并不重要,但这正是您所期望的:如果您@synchronize,那么您所在的线程将被阻塞,直到它可以独占执行。如果您异步分派(dispatch)到一个串行分派(dispatch)队列,那么调用线程可以继续处理其他事情,无论您实际做什么,都将始终发生在同一个已知队列中。

因此,它们等效于确保一次仅从一个队列使用第三种资源。

如果您有一个可以通过用户界面从主队列访问的资源并且您想要改变它,那么调度可能是一个更好的主意。然后您的用户界面代码不需要显式地 @synchronize,从而很自然地将线程方案的复杂性隐藏在对象中。如果您有一个中央参与者可以触发其他不同参与者的其中一些更改,那么调度也将是一个更好的主意;这将允许它们同时运行。

同步更紧凑,更容易进行单步调试。如果您正在做的事情往往是两三行,并且您无论如何都需要同步调度它,那么创建队列的努力是不值得的——尤其是当您考虑创建队列的隐性成本时一个 block 并将其移动到堆上。

关于ios - @synchronized block 与 GCD dispatch_async(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14722252/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com