这两种方法在obj-c中调用主线程有什么不同吗?

时间:2013-09-30 23:54:58

标签: objective-c multithreading

以下是使用block致电的代码:

dispatch_async(dispatch_get_main_queue(), ^{
   [self doSomething];
});

这个人正在使用selector调用:

[self performSelectorOnMainThread:@selector(doSomething)
 withObject:nil
waitUtilDone:NO];

1 个答案:

答案 0 :(得分:2)

是 - 在第一种情况下,您创建一个块并将其发布到主队列。 dispatch_asynccopy阻止。复制块会导致它保留它引用的每个对象。因此,self将被保留,就像您在块中提到的任何其他对象一样。持有该区块的机制是Grand Central Dispatch。

在第二种情况下,您只需在主线程上安排对doSomething的调用。进行调用的机制将是一个运行循环。 self并且最多只保留一个参数对象。

GCD和运行循环之间的区别在于运行循环具有模式。只有在运行循环处于兼容模式时才会将事务排队。在实践中,您最常使用的是通过排队在NSDefaultRunLoopMode中发生的事情。当用户与用户界面交互时,它切换到默认模式以外的模式。因此,在用户停止交互之前,您的工作不会发生。例如。在iOS上,用户被认为是在他们的手指停止时进行交互。所以你可以安排你知道太重的工作,比如平滑滚动继续下去,直到用户完成交互后不会发生这种情况。

您指定的选择器将使用NSRunLoopCommonModes,其中包括跟踪(用户互动)模式,但与performSelectorOnMainThread:...modes:进行比较和对比。