gpt4 book ai didi

iphone - Objective-C中的静态变量和多个线程

转载 作者:行者123 更新时间:2023-12-01 18:27:36 25 4
gpt4 key购买 nike

我正在使用方法编写NSNotificationCenter的类别:

+(void)postNotificationName:(NSString*)name onMainThread:(BOOL)mainThread withObject:(id)object;

我这样做是为了确保我清楚地知道通知是通过哪个线程传递的,因为这导致了很多隐患。因此,为了避免每次我通过每次调用 [NSNotificationCenter defaultCenter]来发布通知时都进行额外的查找,我认为我必须只创建一次静态变量:
static NSNotificationCenter *defaultCenter;
+(void)postNotificationName:(NSString*)name onMainThread:(BOOL)mainThread withObject:(id)object
{
if(!defaultCenter)
defaultCenter = [NSNotificationCenter defaultCenter];
if(mainThread) {
dispatch_async(dispatch_get_main_queue(), ^{
[defaultCenter postNotificationName:name object:object];
});
} else {
[defaultCenter postNotificationName:name object:object];
}
}

我在做什么安全吗?如果 defaultCenter最初是在后台线程上定义的,然后又在主线程上再次使用,该怎么办?这会带来麻烦吗?有一个更好的方法吗?

最佳答案

在静态方面,我同意乔的观点。另外,如果您甚至能够衡量应用程序调用defaultCenter和使用缓存值之间的差异,我会感到非常惊讶。

它可能已经用dispatch_once之类的东西实现了,这相当快。

此外,我是否建议使用现有的东西来确保您在适当的线程上收到通知?

现有的方法怎么样

- (id)addObserverForName:(NSString *)name
object:(id)obj
queue:(NSOperationQueue *)queue
usingBlock:(void (^)(NSNotification *))block

它有几个好处,首先,它是一个基于块的API,非常适合处理通知。您的处理代码正确无误。

无论如何,请注意第三个参数。您可以给它指定一个操作队列,无论该通知是从哪个线程发送的,通知都将在该队列中接收。

这也是一个更简洁的界面,因为接收方指定在哪个队列上处理通知,从而使发送方脱离该责任。

关于iphone - Objective-C中的静态变量和多个线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11990231/

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