Поиск…


Вступление

Уведомления iOS - это простой и эффективный способ отправки данных в связном режиме. То есть отправителю уведомления не нужно заботиться о том, кто (если кто-либо) получает уведомление, он просто отправляет его туда в остальную часть приложения, и его можно подхватить множеством вещей или ничего в зависимости от состояние вашего приложения.

Источник : - HACKING with Swift

параметры

параметр подробности
название Название уведомления, для которого зарегистрирован наблюдатель; то есть только уведомления с этим именем используются для добавления блока в очередь операций. Если вы передаете нуль, центр уведомлений не использует имя уведомления, чтобы решить, следует ли добавить блок в очередь операций.
OBJ Объект, чьи уведомления, которые наблюдатель хочет получить; то есть только уведомления, отправленные этим отправителем, доставляются наблюдателю. Если вы передадите ноль, центр уведомлений не использует отправителя уведомления, чтобы решить, передавать ли его наблюдателю.
очередь Операционная очередь, к которой должен быть добавлен блок. Если вы передаете нуль, блок запускается синхронно в потоке проводки.
блок Блок, который будет выполняться при получении уведомления. Блок копируется центром уведомлений и (копией) удерживается до тех пор, пока регистрация наблюдателя не будет удалена.

замечания

Объект NSNotificationCenter (или просто центр уведомлений) предоставляет механизм для передачи информации внутри программы. Объектом NSNotificationCenter является, по существу, таблица отправки уведомлений.

Для получения дополнительной информации ознакомьтесь с документацией Apple здесь.

NSNotification & NSNotificationCenter в Swift

Добавление наблюдателя

Соглашение об именовании

Уведомления идентифицируются глобальными объектами NSString, имена которых составлены следующим образом:

Name of associated class + Did | Will + UniquePartOfName + Notification

Например:

  • NSApplicationDidBecomeActiveNotification
  • NSWindowDidMiniaturizeNotification
  • NSTextViewDidChangeSelectionNotification
  • NSColorPanelColorDidChangeNotification

Swift 2.3

NSNotificationCenter.defaultCenter().addObserver(self, 
                                                 selector: #selector(self.testNotification(_:)), 
                                                 name: "TestNotification", 
                                                 object: nil)

Swift 3

NSNotificationCenter.default.addObserver(self, 
                                         selector: #selector(self.testNotification(_:)), 
                                         name: NSNotification.Name(rawValue: "TestNotification"), 
                                         object: nil)

Objective-C

[[NSNotificationCenter defaultCenter] addObserver:self 
                                      selector:@selector(testNotification:) 
                                      name:@"TestNotification" 
                                      object:nil];

PS: Стоит также отметить, что количество раз, когда наблюдатель был добавлен, должен быть точно количеством раз, когда наблюдатель удаляется. Ошибка новобранец заключается в том, чтобы добавить наблюдателя в viewWillAppear: из UIViewController, но удаление наблюдателя в viewDidUnload: приведет к viewWillAppear: количеству нажатий и, таким образом, к утечке наблюдателя, а селектор уведомлений будет вызван излишним образом.

Удаление наблюдателей

Swift 2.3

//Remove observer for single notification
NSNotificationCenter.defaultCenter().removeObserver(self, name: "TestNotification", object: nil)
    
//Remove observer for all notifications
NotificationCenter.defaultCenter().removeObserver(self)

Swift 3

//Remove observer for single notification
NotificationCenter.default.removeObserver(self, name: NSNotification.Name(rawValue: "TestNotification"), object: nil)

//Remove observer for all notifications
NotificationCenter.default.removeObserver(self)

Objective-C

//Remove observer for single notification
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"TestNotification" object:nil];
    
//Remove observer for all notifications
[[NSNotificationCenter defaultCenter] removeObserver:self];

Проводка уведомления

стриж

NSNotificationCenter.defaultCenter().postNotificationName("TestNotification", object: self)

Objective-C

[[NSNotificationCenter defaultCenter] postNotificationName:@"TestNotification" object:nil];

Проводка уведомления с данными

стриж

let userInfo: [String: AnyObject] = ["someKey": myObject]
NSNotificationCenter.defaultCenter().postNotificationName("TestNotification", object: self, userInfo: userInfo)

Objective-C

NSDictionary *userInfo = [NSDictionary dictionaryWithObject:myObject forKey:@"someKey"];
[[NSNotificationCenter defaultCenter] postNotificationName: @"TestNotification" object:nil userInfo:userInfo];

Наблюдение за уведомлением

стриж

func testNotification(notification: NSNotification) {
    let userInfo = notification.userInfo
    let myObject: MyObject = userInfo["someKey"]
}

Objective-C

- (void)testNotification:(NSNotification *)notification {
    NSDictionary *userInfo = notification.userInfo;
    MyObject *myObject = [userInfo objectForKey:@"someKey"];
}

Добавление / удаление наблюдателя с блоком

Вместо добавления наблюдателя с селектором можно использовать блок:

id testObserver = [[NSNotificationCenter defaultCenter] addObserverForName:@"TestNotification"
                                                                    object:nil 
                                                                     queue:nil 
                                                                usingBlock:^(NSNotification* notification) {
    NSDictionary *userInfo = notification.userInfo;
    MyObject *myObject = [userInfo objectForKey:@"someKey"];
}];

Затем наблюдателя можно удалить с помощью:

[[NSNotificationCenter defaultCenter] removeObserver:testObserver 
                                                name:@"TestNotification"
                                              object:nil];

Добавить и удалить наблюдателя для имени

// Add observer
let observer = NSNotificationCenter.defaultCenter().addObserverForName("nameOfTheNotification", object: nil, queue: nil) { (notification) in
    // Do operations with the notification in this block
}

// Remove observer
NSNotificationCenter.defaultCenter().removeObserver(observer)


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow