iOS
NSNotificationCenter
Поиск…
Вступление
Уведомления iOS - это простой и эффективный способ отправки данных в связном режиме. То есть отправителю уведомления не нужно заботиться о том, кто (если кто-либо) получает уведомление, он просто отправляет его туда в остальную часть приложения, и его можно подхватить множеством вещей или ничего в зависимости от состояние вашего приложения.
Источник : - HACKING with Swift
параметры
параметр | подробности |
---|---|
название | Название уведомления, для которого зарегистрирован наблюдатель; то есть только уведомления с этим именем используются для добавления блока в очередь операций. Если вы передаете нуль, центр уведомлений не использует имя уведомления, чтобы решить, следует ли добавить блок в очередь операций. |
OBJ | Объект, чьи уведомления, которые наблюдатель хочет получить; то есть только уведомления, отправленные этим отправителем, доставляются наблюдателю. Если вы передадите ноль, центр уведомлений не использует отправителя уведомления, чтобы решить, передавать ли его наблюдателю. |
очередь | Операционная очередь, к которой должен быть добавлен блок. Если вы передаете нуль, блок запускается синхронно в потоке проводки. |
блок | Блок, который будет выполняться при получении уведомления. Блок копируется центром уведомлений и (копией) удерживается до тех пор, пока регистрация наблюдателя не будет удалена. |
замечания
Объект NSNotificationCenter (или просто центр уведомлений) предоставляет механизм для передачи информации внутри программы. Объектом NSNotificationCenter является, по существу, таблица отправки уведомлений.
Для получения дополнительной информации ознакомьтесь с документацией Apple здесь.
Добавление наблюдателя
Соглашение об именовании
Уведомления идентифицируются глобальными объектами 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)