我在应用程序中同时使用了GCD和performSelectorOnMainThread:waitUntilDone,并且倾向于认为它们是可互换的——也就是说,performSelectorOnMainThread:waitUntilDone是GCD C语法的Obj-C包装.我一直认为这两个命令是等效的:

dispatch_sync(dispatch_get_main_queue(), ^{ [self doit:YES]; });


[self performSelectorOnMainThread:@selector(doit:) withObject:YES waitUntilDone:YES];

我错了吗?也就是说,performSelector*命令与GCD命令有什么区别吗?我已经阅读了很多关于它们的文档,但还没有看到一个明确的答案.

推荐答案

performSelectorOnMainThread:不使用GCD向主线程上的对象发送消息.

以下是documentation人表示该方法是如何实现的:

- (void) performSelectorOnMainThread:(SEL) selector withObject:(id) obj waitUntilDone:(BOOL) wait {
  [[NSRunLoop mainRunLoop] performSelector:selector target:self withObject:obj order:1 modes: NSRunLoopCommonModes];
}

在第performSelector:target:withObject:order:modes:页,文件说明:

此方法设置一个计时器,以便在下一次运行循环迭代开始时对当前线程的运行循环执行aSelector消息.定时器配置为在modes参数指定的模式下运行.当计时器触发时,线程try 将消息从运行循环中出列并执行 Select 器.如果运行循环正在运行且处于指定模式之一,则会成功;否则,计时器将等待运行循环处于这些模式之一.

Objective-c相关问答推荐

如何在 Objective-C 中编写计时器?

检测时间格式是 12 小时还是 24 小时格式

iphone 的 UIPopoverController 不工作?

如何在 Cocoa 中创建字符串的 MD5 哈希?

是否可以将 NSInteger 转换为 NSNumber?

iOS中CALayer的UIImage

在objective-c中创建现在的时间戳作为NSNumber

Objective-C 属性的默认属性是什么?

iOS:使用设备修饰符加载 xib 文件?

检测设备是否支持电话?

UITabBar 未在 ios 7 中显示所选项目图像

在Objective-C中替换字符串中的一个字符

如何将@selector 作为参数传递?

隐藏 NSTableView 标头?

UIView: opaque vs. alpha vs. opacity

如何在不管理 UDID 和重新编译的情况下无线分发 ios 应用程序

UIScrollView contentSize 不起作用

带有Go按钮而不是返回的 iOS 键盘

在 iPhone 上查找用户的 Documents 目录的最佳方法是什么?

UIPageViewController,如何在不打乱数据源指定顺序的情况下正确跳转到特定页面?