В каком потоке вызываются блоки обработки завершения iOS? - PullRequest
8 голосов
/ 11 марта 2011

Например, в GKScore reportScoreWithCompletionHandler ( документация ) предположим, что вы звоните

[score reportScoreWithCompletionHandler:^(NSError *error) {
   // do some stuff that may be thread-unsafe
}];

В каком потоке будет вызываться обработчик завершения: основной поток, тот же поток, что и reportScoreWithCompletionHandler, или другой поток (предположительно, поток, для которого составляется отчет о фактических результатах)?

Другими словами, должна ли работа, выполняемая в обработчике завершения, быть поточно-ориентированной (например, не имеет значения, в каком потоке она выполняется)?

1 Ответ

6 голосов
/ 11 марта 2011

На практике это не имеет значения.

Если вам нужно, чтобы ваше завершение было выполнено в главном потоке, просто отправьте его в основной поток:

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