Iphone 在哪个线程中调用iOS完成处理程序块?

Iphone 在哪个线程中调用iOS完成处理程序块?,iphone,objective-c,multithreading,objective-c-blocks,Iphone,Objective C,Multithreading,Objective C Blocks,例如,在GKScore的reportScoreWithCompletionHandler()中,假设您调用 [score reportScoreWithCompletionHandler:^(NSError *error) { // do some stuff that may be thread-unsafe }]; 将在哪个线程中调用完成处理程序:主线程、调用了与reportScoreWithCompletionHandler相同的线程,或者不同的线程(可能是完成实际分数报告的线程)

例如,在
GKScore
reportScoreWithCompletionHandler
()中,假设您调用

[score reportScoreWithCompletionHandler:^(NSError *error) {
   // do some stuff that may be thread-unsafe
}];
将在哪个线程中调用完成处理程序:主线程、调用了与
reportScoreWithCompletionHandler
相同的线程,或者不同的线程(可能是完成实际分数报告的线程)


换句话说,在完成处理程序中完成的工作是否需要是线程安全的(例如,它在哪个线程中完成并不重要)?

实际上,这并不重要

如果需要在主线程中运行完成,只需将其分派到主线程:

[score reportScoreWithCompletionHandler:^(NSError *error) {
    dispatch_async(dispatch_get_main_queue(), ^{
        // do your stuff here
    });
}];

对于完成处理程序没有特定的线程,苹果表示它将是一个辅助线程(肯定不是主线程)。您可以使用访问iOS中的不同线程。

很有趣。这个循环是否与运行循环完美交叉?(也就是说,当调用完成处理程序时,是否会在下一次运行循环迭代之前调用已调度的任务,或者会有一些延迟?)我认为主线程运行循环将处理排队的块,作为正常事件处理周期的一部分。所以它应该“很快”就会发生,但和所有与runloop相关的事情一样,时间并不能保证。真的很有趣。我使用UIPrintInteractionController的完成处理程序,它总是在主线程上被调用。