我有一个方法说someMethod(),我总是希望这个方法应该在主线程下执行。所以我这样写了这个方法..
-(void)someMethod
{
if([NSThread mainThread])
{
// Do method stuffs
}
else
{
[self performSelectorOnMainThread:@selector(someMethod) withObject:nil waitUntilDone:YES];
}
}
问题:
由于
答案 0 :(得分:1)
“waitUntilDone:YES”很危险,如果你不注意,它可能导致死锁。你真的需要等到方法完成吗?尽可能避免这种情况。
gcd更灵活;即使你有一个方法会有各种参数,包括不是对象的参数,dispatch_async到主线程也会工作。
如果你想确认在主线程上调用该方法,那么如果在另一个线程上调用它将是一个bug,那么你使用NSAssert。
答案 1 :(得分:-1)
你的例子是正确的。在iOS上,必须在主线程上执行与用户界面有关的所有操作。如果在后台线程上执行更改用户界面的代码,则行为未定义。如果您的代码没有更改用户界面,则可以安全地在后台线程上运行。
答案 2 :(得分:-1)
不,在你的情况下,可以在任何线程上调用此方法,并且只有当它是主线程时才执行方法。 更好的方法是始终在主线程上调用该方法,
//像这样调用你的方法
dispatch_async(dispatch_get_main_queue(), ^{
someMethod()
});
编辑:你也可以仔细检查你在主线程的方法本身
if([NSThread mainThread])
{
// Do method stuffs
}
else
{
dispatch_async(dispatch_get_main_queue(), ^{
someMethod()
});
}