gpt4 book ai didi

objective-c - 使用_cmd在 objective-c 的主线程上执行方法

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

我遇到了这个 _cmd 技巧:

-(void)methodToBeRunOnMainThreadWithObj:(id)object {
if (![NSThread isMainThread) {
[self performSelectorOnMainThread:_cmd withObject:object]
} else {
// ... method body
}
}

这是确保方法在主线程上执行的可靠方法吗?

最佳答案

这可行,但有点反模式。如果调用该方法的线程不是主线程,我会抛出一个错误。调用者有责任确保在正确的线程上调用方法,这些类型的 hack 只会鼓励丑陋的代码。此外,如果您依赖于此,那么您每次调用此方法时都会突然加倍消息分发开销。

如果实在无法改变调用者的行为,可以尝试以下方法:

-(void)methodToBeRunOnMainThreadWithObj:(id)object {
dispatch_sync(dispatch_get_main_queue(), ^{
// code goes here
});
}

这将导致调度 block 内的所有代码都在主线程上执行,并且该方法直到完成后才会返回。如果您希望该方法立即返回,您可以改用 dispatch_async。如果您使用 dispatch_sync,您甚至可以在具有非 void 返回类型的方法上使用这个技巧。

此代码还有一个额外的好处,即支持带有非对象类型(int 等)参数的方法。它还支持具有任意数量参数的方法,而 performSelector:withObject: 及其兄弟方法仅支持有限数量的参数。另一种方法是设置 NSInvocation 对象,这很麻烦。

请注意,这需要在您的平台上安装 Grand Central Dispatch (GCD)。

关于objective-c - 使用_cmd在 objective-c 的主线程上执行方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13190260/

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