Подтвердить что ты не робот

Проводка NSNotification в основной теме

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

dispatch_async(dispatch_get_main_queue(),^{
    [[NSNotificationCenter defaultCenter] postNotificationName:@"ImageRetrieved" 
                                                        object:nil 
                                                      userInfo:imageDict];
});
4b9b3361

Ответ 1

Да, вы можете.

Как правило, вы хотите, чтобы NSNotifications отправлялись в основном, особенно если они запускают действия пользовательского интерфейса, такие как отклонение модального диалогового окна входа.

Предоставление уведомлений на отдельные темы

Регулярные центры уведомлений предоставляют уведомления о потоке в которое было отправлено. Распределенные центры уведомлений доставлять уведомления по основному потоку. Иногда вам может потребоваться уведомления, которые должны быть доставлены по определенному потоку, который определенных вами вместо центра уведомлений. Например, если объект, работающий в фоновом потоке, прослушивает уведомления из пользовательского интерфейса, такие как закрытие окна, вы хотел бы получать уведомления в фоновом потоке вместо основного потока. В этих случаях вы должны уведомлений, поскольку они доставляются по потоку по умолчанию и перенаправляют их к соответствующей теме.

Ответ 2

Да

Это - вы попадаете в основной поток и публикуете свое уведомление. Не может быть безопаснее, чем это.

Ответ 3

Да

Синтаксис

Swift 2

dispatch_async(dispatch_get_main_queue()) {
    NSNotificationCenter.defaultCenter().postNotificationName("updateSpinner", object: nil, userInfo: ["percent":15])
}
Синтаксис

Swift 3

DispatchQueue.main.async {
    NotificationCenter.default.post(name: "updateSpinner", object: nil, userInfo: ["percent":15])
}

Ответ 4

Где-то вдоль линии это стало возможным:

addObserver(forName:object:queue:using:)

который здесь, но весь смысл - это объект queue.

Операционная очередь, к которой должен быть добавлен блок. Если вы пройдете nil, блок выполняется синхронно в потоке проводки.

Итак, как вы получаете очередь, которая соответствует основной runloop?

let mainQueue = OperationQueue.main

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