检测代码是否在Objective-C中的主线程上运行的正确方法是什么? (IOS)

时间:2010-11-19 23:55:03

标签: iphone objective-c multithreading ios

我的代码需要保证在主线程上运行某个操作,但调用可能来自后台线程。

为了检测后台的情况,我使用了以下内容:

- (void)selectorToRunInMainThread:(id)arguments
{
    // push to main thread
        if ([NSRunLoop currentRunLoop] != [NSRunLoop mainRunLoop])
        {
            [self performSelectorOnMainThread:@selector(selectorToRunInMainThread:) withObject:arguments waitUntilDone:NO];
            return;
        }

    /*
    ... function content ...
    */
}

这适用于iOS 4和iOS 3.2,但不适用于iOS 3.1.3及更早版本。在这些早期版本中,该函数将继续被无限循环调用。

将比较更改为:

if (![[NSRunLoop currentRunLoop] isEqualTo:[NSRunLoop mainRunLoop]])

没有效果,它们仍然永远不会与相同的值相比。

我找到了一个似乎有效的解决方案,但我想先看看其他人的建议。

1 个答案:

答案 0 :(得分:94)

[NSThread isMainThread]如果没有,可以通过任何一种机制发送到主线程(你有什么不错)。