Нужно ли в этом случае dispatch_async (dispatch_get_main_queue (), ...)? - PullRequest
5 голосов
/ 05 марта 2012

Я наткнулся на этот кусок кода, и я не могу понять, почему автор сделал это.Взгляните на этот код:

someMethodStandardMethodUsingABlock:^() {
    dispatch_async(dispatch_get_main_queue(), ^{
        [[NSNotificationCenter defaultCenter] postNotificationName:"notif" object:nil];
    });
}];

У меня есть метод с блоком завершения, и в этом блоке должно быть опубликовано уведомление.Я не совсем понимаю, почему в этом случае необходимо dispatch_async в главной очереди.Блок уже будет запущен в главном потоке, и даже если бы это было не так, я не думаю, что это действительно имеет значение, не так ли?Я бы просто написал это:

someMethodStandardMethodUsingABlock:^() {
    [[NSNotificationCenter defaultCenter] postNotificationName:"notif" object:nil];
}];

И в моем тестировании это сработает.

Если вы поможете мне пролить свет на это, я очень ценю это!

Мэтт

Ответы [ 2 ]

9 голосов
/ 05 марта 2012

Эти 2 предложения из справочника классов NSNotificationCenter предлагают несколько возможных причин:

Центр уведомлений доставляет уведомления наблюдателям синхронно. Другими словами, postNotification: методы не возвращаться, пока все наблюдатели не получат и не обработают извещение.

...

В многопоточном приложении уведомления всегда доставляются в поток, в котором было опубликовано уведомление, которое может не тот же поток, в котором наблюдатель зарегистрировался.

Так что, возможно (а) автор не хочет, чтобы код блокировался, пока все наблюдатели не обработали уведомление, и / или (б) он не хочет, чтобы методы наблюдателя выполнялись в главном потоке.

0 голосов
/ 05 марта 2012

Иногда вам нужно запускать методы, которые запускают некоторое выполнение асинхронно и сразу же возвращаются. Например. некоторые из AppDelegate ключевых методов, таких как applicationDidBecomeActive или applicationDidEnterBackground, должны быть выполнены и возвращены быстро, чтобы ОС не убивала ваше приложение.

Я не знаю, относится ли это к вашему вопросу, но это возможное объяснение использования dispatch_async.

...