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

标签 objective-c multithreading

这里是使用 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/

相关文章:

c# - 并行编程 : create a certain number of processes and related data/work

iphone - 从资源文件夹中获取所有以前缀开头的文件名

objective-c - objective C 使用字符串调用方法

iOS 8 如何防止 Spritekit 帧率下降

objective-c - 如何在一行代码中写 `performSelectorInBackground: afterDelay:`?

windows - 如何在 Perl 中线程安全地设置 STDOUT 编码?

java - 监听jms队列并一次只处理10条消息

objective-c - 如何检测是否正在使用/从 Swift 编译 Objective-C header

ios - 尝试将 uiimageview 图像保存到变量中

c++ - 多线程程序导致段错误,使用 std::list::push_back