这里是使用 block
的代码调用:
dispatch_async(dispatch_get_main_queue(), ^{
[self doSomething];
});
这个正在使用 selector
进行调用:
[self performSelectorOnMainThread:@selector(doSomething)
withObject:nil
waitUtilDone:NO];
最佳答案
是的 - 在第一种情况下,您创建一个 block 并将其发布到主队列。 dispatch_async
将复制
该 block 。复制 block 会导致它保留它引用的每个对象。因此,self
将被保留,就像您在 block 中提到的任何其他对象一样。保持区 block 的机制是 Grand Central Dispatch。
在第二种情况下,您只需在主线程上安排对 doSomething
的调用。进行调用的机制将是一个运行循环。 self
和最多一个参数对象将被保留。
GCD 和运行循环之间的区别在于运行循环具有模式。仅当运行循环处于兼容模式时,您才将事情排队等待执行。在实践中,您最常使用的方法是对 NSDefaultRunLoopMode
中发生的事情进行排队。当用户与用户界面交互时,它会切换到默认模式以外的模式。因此,在用户停止交互之前,您的工作不会发生。例如。在 iOS 上,用户在手指按下时被视为正在交互。因此,您可以安排一些您知道过于繁重而无法继续进行的工作,例如,平滑滚动,这样直到用户完成交互后才立即发生这种情况。
您指定的选择器将使用 NSRunLoopCommonModes
,其中包括跟踪(用户交互)模式,但与 performSelectorOnMainThread:...modes:
进行比较和对比。
关于objective-c - 这两种在obj-c中调用主线程的方法有什么不同吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19105764/