iOS
NSNotificationCenter
Suche…
Einführung
iOS-Benachrichtigungen sind eine einfache und leistungsstarke Methode, um Daten lose gekoppelt zu senden. Das heißt, der Absender einer Benachrichtigung muss sich nicht darum kümmern, von wem (wenn jemand) die Benachrichtigung erhalten wird. Er wird nur an den Rest der App weitergeleitet, und er kann von vielen Dingen abgerufen werden oder abhängig davon, was nicht Der Status Ihrer App.
Quelle : - HACKING mit Swift
Parameter
Parameter | Einzelheiten |
---|---|
Name | Name der Benachrichtigung, für die der Beobachter registriert werden soll; Das heißt, nur Benachrichtigungen mit diesem Namen werden verwendet, um den Block zur Operationswarteschlange hinzuzufügen. Wenn Sie null übergeben, verwendet das Benachrichtigungscenter nicht den Namen einer Benachrichtigung, um zu entscheiden, ob der Block der Operationswarteschlange hinzugefügt werden soll. |
obj | Das Objekt, dessen Benachrichtigungen der Beobachter erhalten möchte; es werden also nur Benachrichtigungen dieses Absenders an den Beobachter gesendet. Wenn Sie null übergeben, verwendet die Benachrichtigungszentrale nicht den Absender einer Benachrichtigung, um zu entscheiden, ob sie dem Beobachter zugestellt werden soll. |
Warteschlange | Die Operationswarteschlange, zu der der Block hinzugefügt werden soll. Wenn Sie nil übergeben, wird der Block synchron im Buchungsthread ausgeführt. |
Block | Der Block, der ausgeführt werden soll, wenn die Benachrichtigung empfangen wird. Der Block wird vom Benachrichtigungscenter kopiert und (die Kopie) gehalten, bis die Beobachterregistrierung entfernt wird. |
Bemerkungen
Ein NSNotificationCenter-Objekt (oder einfach eine Benachrichtigungszentrale) stellt einen Mechanismus zum Senden von Informationen innerhalb eines Programms bereit. Ein NSNotificationCenter-Objekt ist im Wesentlichen eine Benachrichtigungstabelle.
Für mehr Informationen, überprüfen Sie die Apple - Dokumentation heraus hier
Beobachter hinzufügen
Namenskonvention
Benachrichtigungen werden durch globale NSString-Objekte identifiziert, deren Namen folgendermaßen zusammengesetzt sind:
Name of associated class
+ Did | Will
+ UniquePartOfName
+ Notification
Zum Beispiel:
- NSApplicationDidBecomeActiveNotification
- NSWindowDidMiniaturizeNotification
- NSTextViewDidChangeSelectionNotification
- NSColorPanelColorDidChangeNotification
Schnell 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)
Ziel c
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(testNotification:)
name:@"TestNotification"
object:nil];
PS: Es ist auch erwähnenswert, dass die Anzahl der Hinzufügungen eines Beobachters genau der Anzahl der Entfernungen des Beobachters entsprechen muss. Ein Anfängerfehler ist das Hinzufügen des Beobachters in viewWillAppear:
eines UIViewControllers, das Entfernen des Beobachters in viewDidUnload:
bewirkt jedoch eine ungerade Anzahl von viewDidUnload:
, wodurch der Beobachter und der Benachrichtigungsselektor überflüssig werden.
Beobachter entfernen
Schnell 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)
Ziel c
//Remove observer for single notification
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"TestNotification" object:nil];
//Remove observer for all notifications
[[NSNotificationCenter defaultCenter] removeObserver:self];
Benachrichtigung versenden
Schnell
NSNotificationCenter.defaultCenter().postNotificationName("TestNotification", object: self)
Ziel c
[[NSNotificationCenter defaultCenter] postNotificationName:@"TestNotification" object:nil];
Benachrichtigung mit Daten buchen
Schnell
let userInfo: [String: AnyObject] = ["someKey": myObject]
NSNotificationCenter.defaultCenter().postNotificationName("TestNotification", object: self, userInfo: userInfo)
Ziel c
NSDictionary *userInfo = [NSDictionary dictionaryWithObject:myObject forKey:@"someKey"];
[[NSNotificationCenter defaultCenter] postNotificationName: @"TestNotification" object:nil userInfo:userInfo];
Benachrichtigung beobachten
Schnell
func testNotification(notification: NSNotification) {
let userInfo = notification.userInfo
let myObject: MyObject = userInfo["someKey"]
}
Ziel c
- (void)testNotification:(NSNotification *)notification {
NSDictionary *userInfo = notification.userInfo;
MyObject *myObject = [userInfo objectForKey:@"someKey"];
}
Beobachter mit Block hinzufügen / entfernen
Anstatt einen Beobachter mit einem Selektor hinzuzufügen, kann ein Block verwendet werden:
id testObserver = [[NSNotificationCenter defaultCenter] addObserverForName:@"TestNotification"
object:nil
queue:nil
usingBlock:^(NSNotification* notification) {
NSDictionary *userInfo = notification.userInfo;
MyObject *myObject = [userInfo objectForKey:@"someKey"];
}];
Der Beobachter kann dann entfernt werden mit:
[[NSNotificationCenter defaultCenter] removeObserver:testObserver
name:@"TestNotification"
object:nil];
Beobachter für Namen hinzufügen und entfernen
// 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)