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

Joh*_*ohn 14 multithreading ios

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

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

    dispatch_async(dispatch_get_main_queue(), ^{ UI stuff });
Run Code Online (Sandbox Code Playgroud)

TIA:约翰

log*_*ell 11

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

对于通知,我想你想要这个小小的剪辑.

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

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

最后,对于KVO,通知可以来自其他线程.以下是Apple工程师对处理它们的看法.

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


BP.*_*BP. 8

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

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