iOS
NSNotificationCenter
Zoeken…
Invoering
iOS-meldingen zijn een eenvoudige en krachtige manier om gegevens op een losjes gekoppelde manier te verzenden. Dat wil zeggen, de afzender van een melding hoeft zich geen zorgen te maken over wie (als iemand) de melding ontvangt, deze wordt gewoon naar de rest van de app gepost en het kan worden opgepikt door veel dingen of niets, afhankelijk van de status van uw app.
Bron : - HACKING met Swift
parameters
Parameter | Details |
---|---|
naam | De naam van de melding waarvoor de waarnemer moet worden geregistreerd; dat wil zeggen dat alleen meldingen met deze naam worden gebruikt om het blok aan de wachtrij toe te voegen. Als u nul doorgeeft, gebruikt het meldingscentrum de naam van een melding niet om te beslissen of het blok aan de wachtrij moet worden toegevoegd. |
obj | Het object wiens meldingen de waarnemer wil ontvangen; dat wil zeggen, alleen meldingen die door deze afzender worden verzonden, worden aan de waarnemer afgeleverd. Als u nul passeert, gebruikt het meldingscentrum de afzender van een melding niet om te beslissen of deze aan de waarnemer wordt bezorgd. |
wachtrij | De bewerkingswachtrij waaraan blok moet worden toegevoegd. Als u nul doorgeeft, wordt het blok synchroon uitgevoerd op de boekingsdraad. |
blok | Het blok dat moet worden uitgevoerd wanneer de melding wordt ontvangen. Het blok wordt door het meldingscentrum gekopieerd en (de kopie) bewaard totdat de waarnemersregistratie is verwijderd. |
Opmerkingen
Een NSNotificationCenter-object (of eenvoudigweg een meldingscentrum) biedt een mechanisme voor het uitzenden van informatie binnen een programma. Een NSNotificationCenter-object is in wezen een meldingstabel voor meldingen.
Bekijk hier de Apple-documentatie
Een waarnemer toevoegen
Naamgeving
Meldingen worden geïdentificeerd door globale NSString-objecten waarvan de namen op deze manier zijn samengesteld:
Name of associated class
+ Did | Will
+ UniquePartOfName
+ Notification
Bijvoorbeeld:
- 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)
Doelstelling C
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(testNotification:)
name:@"TestNotification"
object:nil];
PS: Het is ook vermeldenswaard dat het aantal keren dat een waarnemer is toegevoegd, precies het aantal keren moet zijn dat de waarnemer is verwijderd. Een groentje fout is om de waarnemer toe te voegen in de viewWillAppear:
van een UIViewController, maar de waarnemer verwijderen in viewDidUnload:
zal een ongelijk aantal duwtjes veroorzaken en dus de waarnemer lekken en de meldingskiezer op een overbodige manier worden aangeroepen.
Waarnemers verwijderen
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)
Doelstelling C
//Remove observer for single notification
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"TestNotification" object:nil];
//Remove observer for all notifications
[[NSNotificationCenter defaultCenter] removeObserver:self];
Een melding plaatsen
Snel
NSNotificationCenter.defaultCenter().postNotificationName("TestNotification", object: self)
Doelstelling C
[[NSNotificationCenter defaultCenter] postNotificationName:@"TestNotification" object:nil];
Een melding met gegevens plaatsen
Snel
let userInfo: [String: AnyObject] = ["someKey": myObject]
NSNotificationCenter.defaultCenter().postNotificationName("TestNotification", object: self, userInfo: userInfo)
Doelstelling C
NSDictionary *userInfo = [NSDictionary dictionaryWithObject:myObject forKey:@"someKey"];
[[NSNotificationCenter defaultCenter] postNotificationName: @"TestNotification" object:nil userInfo:userInfo];
Een melding waarnemen
Snel
func testNotification(notification: NSNotification) {
let userInfo = notification.userInfo
let myObject: MyObject = userInfo["someKey"]
}
Doelstelling C
- (void)testNotification:(NSNotification *)notification {
NSDictionary *userInfo = notification.userInfo;
MyObject *myObject = [userInfo objectForKey:@"someKey"];
}
Een waarnemer met een blok toevoegen / verwijderen
In plaats van een waarnemer met een selector toe te voegen, kan een blok worden gebruikt:
id testObserver = [[NSNotificationCenter defaultCenter] addObserverForName:@"TestNotification"
object:nil
queue:nil
usingBlock:^(NSNotification* notification) {
NSDictionary *userInfo = notification.userInfo;
MyObject *myObject = [userInfo objectForKey:@"someKey"];
}];
De waarnemer kan vervolgens worden verwijderd met:
[[NSNotificationCenter defaultCenter] removeObserver:testObserver
name:@"TestNotification"
object:nil];
Voeg toe en verwijder waarnemer voor naam
// 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)