如何确认方法将在目标C中的主线程下执行?

时间:2016-03-21 13:41:19

标签: ios objective-c nsthread background-thread

我有一个方法说someMethod(),我总是希望这个方法应该在主线程下执行。所以我这样写了这个方法..

-(void)someMethod
{
   if([NSThread mainThread])
   {
       // Do method stuffs
   }

   else
   {
       [self performSelectorOnMainThread:@selector(someMethod) withObject:nil waitUntilDone:YES];
   }
}

问题:

  • 这是正确的方法吗?
  • 如果,我通过后台线程调用此方法,会发生什么?

由于

3 个答案:

答案 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()
       });
   }