iOS在主线程上执行委托和观察者调用的方法是什么?

对不起,我不确定这里有没有正确的语言,但是当方法被调用是因为它们是委托方法,或者被列为观察者的目标而调用的方法时,它们是否在主线程上执行?

我想知道是否可以在这些方法中进行UI更改,还是必须将它们包装进去

dispatch_async(dispatch_get_main_queue(), ^{ UI stuff }); 

TIA:约翰

对于代表,这可能会有所不同。 如果文档没有指定,那么通常它们在主线程上发送。 传统上UIKit必须在主线程上使用,所以这些委托几乎总是从主线程调用。

对于通知,我想你想要这个小碎片。

通知中心同步向观察员发送通知。 换句话说,postNotification:方法在所有观察者都收到并处理通知之前不会返回。 要asynchronous发送通知,请使用NSNotificationQueue。 在multithreading应用程序中,通知总是在发布通知的线程中传递,而这些线程可能与观察者自己注册的线程不同

http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/nsnotificationcenter_Class/Reference/Reference.html

最后,对于KVO,通知可以从其他线程进来。 这是苹果工程师在处理这些问题时所要说的。

http://lists.apple.com/archives/cocoa-dev/2007/May/msg00022.html

如上所述,线程将根据调用者而有所不同。 在你的委托方法中,如果你需要适应,你总是可以这样做:

 if ([NSThread isMainThread]) { // do the UI stuff as normal } else { dispatch_async(dispatch_get_main_queue(), ^{ UI stuff }); } 

其基本思想是,在所有情况下,观察者或委托方法在同一个线程中被初始通知(对于观察者模式)或委托代码正在运行,所以如果您不确定是否build议在UI中分派UI块主线程。 我会试着在下面的推理中certificate这个陈述的合理性,当然我可能是错的。

除非在委托协议文档中明确指定,否则在委托模式中,直接在调用者正在调用的同一线程中调用一个方法。 例如,如果调用者(委托对象)想要调用他的委托并且正在“线程1”上运行,那么调用将发生在同一个线程中:

 // this is running in "Thread-1" --> then aDelegateMethod will continue on "Thread-1" [myDelegate aDelegateMethod] 

就观察者模式而言,我没有看到系统在主线程上显式发送观察通知的任何有效原因,特别是如果源自通知的原始值更改正在另一个线程中运行。 事实上,在KVO的情况下,运行时通过添加一些私有方法来改变类定义,这些私有方法覆盖了setter方法来执行通知,而且我没有看到在主线程中显式执行此调用的有效原因。 所以根据我的KVO通知可以来自任何线程,这个线程是相同的,正在运行在观察类的价值变化。

最后,基于NSNotificationCenter的机制可以看到他的通知由同一个线程调用,原来的通知已经发布。 这在Apple文档中已经清楚地说明了(值得一提的是,每个线程都有自己的通知队列)。

所以在所有情况下,线程都被维护,如果你想确保在主队列中调用你的UI块,那么使用你在问题中发布的GCD调用。