我有一个可能来自任何线程的回调.当我得到这个回调,然后我想在主线程上执行某个任务.
我是否需要检查我是否已经在主线程上 - 或者是否因为没有执行此检查而遭受任何惩罚?请调用下面的代码?
dispatch_async(dispatch_get_main_queue(), ^{
// do work here
});
Run Code Online (Sandbox Code Playgroud) 我在我的应用程序中使用了GCD和performSelectorOnMainThread:waitUntilDone,并且倾向于认为它们是可互换的 - 也就是说,performSelectorOnMainThread:waitUntilDone是GCD C语法的Obj-C包装器.我一直在考虑这两个命令是等价的:
dispatch_sync(dispatch_get_main_queue(), ^{ [self doit:YES]; });
[self performSelectorOnMainThread:@selector(doit:) withObject:YES waitUntilDone:YES];
Run Code Online (Sandbox Code Playgroud)
我不对吗?也就是说,performSelector*命令与GCD命令有区别吗?我已经阅读了很多关于它们的文档,但还没有看到明确的答案.
iphone multithreading objective-c grand-central-dispatch ios
我写了一个名为ensureInMainThread的小定义(我用了很多).但是,我不确定在主线程上需要调用哪些用户界面方法.怎么样setNeedsDisplay和setNeedsLayout?对于需要在iOS 5.x中的主线程上调用的方法,经验法则是什么?
这些问题是相关的(一些低质量的问题和答案,以及一些非常具体的案例),但我想要一个全面,单一的好答案:
我从两个线程调用一个方法,并认为我尝试这个:
- (void)hideEnterButton
{
if ([NSThread isMainThread])
{
enterButton.hidden = YES;
}
else
{
[self performSelectorOnMainThread:@selector(hideEnterButton) withObject:nil waitUntilDone:NO];
}
}
Run Code Online (Sandbox Code Playgroud)
原因是我理解所有GUI处理必须在主线程上完成.这会有用吗?