iOS
NSNotificationCenter
Szukaj…
Wprowadzenie
Powiadomienia na iOS to prosty i skuteczny sposób przesyłania danych w luźny sposób. Oznacza to, że nadawca powiadomienia nie musi dbać o to, kto (jeśli ktoś) otrzyma powiadomienie, po prostu umieszcza je tam w pozostałej części aplikacji i może zostać odebrany przez wiele rzeczy lub nic, w zależności od stan twojej aplikacji.
Źródło : - HAKOWANIE za pomocą Swift
Parametry
Parametr | Detale |
---|---|
Nazwa | Nazwa powiadomienia, dla którego należy zarejestrować obserwatora; to znaczy, tylko powiadomienia o tej nazwie są używane do dodawania bloku do kolejki operacji. Jeśli zdasz zero, centrum powiadomień nie używa nazwy powiadomienia, aby zdecydować, czy dodać blok do kolejki operacji. |
obj | Obiekt, którego powiadomienia obserwator chce otrzymywać; oznacza to, że tylko powiadomienia wysłane przez tego nadawcę są dostarczane do obserwatora. Jeśli zdasz zero, centrum powiadomień nie korzysta z nadawcy powiadomienia, aby zdecydować, czy dostarczyć go obserwatorowi. |
kolejka | Kolejka operacji, do której należy dodać blok. Jeśli zdasz zero, blok jest uruchamiany synchronicznie w wątku wysyłającym. |
blok | Blok, który ma zostać wykonany po otrzymaniu powiadomienia. Blok jest kopiowany przez centrum powiadomień i (kopia) jest przechowywany do momentu usunięcia rejestracji obserwatora. |
Uwagi
Obiekt NSNotificationCenter (lub po prostu centrum powiadomień) zapewnia mechanizm rozgłaszania informacji w ramach programu. Obiekt NSNotificationCenter jest w zasadzie tabelą wysyłania powiadomień.
Aby uzyskać więcej informacji, zapoznaj się z dokumentacją Apple tutaj
Dodawanie obserwatora
Konwencja nazewnictwa
Powiadomienia są identyfikowane przez globalne obiekty NSString, których nazwy składają się w następujący sposób:
Name of associated class
+ Did | Will
+ UniquePartOfName
+ Notification
Na przykład:
- NSApplicationDidBecomeActiveNotification
- NSWindowDidMiniaturizeNotification
- NSTextViewDidChangeSelectionNotification
- NSColorPanelColorDidChangeNotification
Swift 2.3
NSNotificationCenter.defaultCenter().addObserver(self,
selector: #selector(self.testNotification(_:)),
name: "TestNotification",
object: nil)
Szybki 3
NSNotificationCenter.default.addObserver(self,
selector: #selector(self.testNotification(_:)),
name: NSNotification.Name(rawValue: "TestNotification"),
object: nil)
Cel C
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(testNotification:)
name:@"TestNotification"
object:nil];
PS: Warto również zauważyć, że liczba dodanych obserwatorów musi być dokładnie taka, ile razy obserwator został usunięty. Błędem nowicjusza jest dodanie obserwatora do viewWillAppear:
UIViewController, ale usunięcie obserwatora w viewDidUnload:
spowoduje nierównomierną liczbę viewDidUnload:
, a tym samym wyciek obserwatora i selektora powiadomień w niepotrzebny sposób.
Usuwanie obserwatorów
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)
Szybki 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)
Cel C
//Remove observer for single notification
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"TestNotification" object:nil];
//Remove observer for all notifications
[[NSNotificationCenter defaultCenter] removeObserver:self];
Publikowanie powiadomienia
Szybki
NSNotificationCenter.defaultCenter().postNotificationName("TestNotification", object: self)
Cel C
[[NSNotificationCenter defaultCenter] postNotificationName:@"TestNotification" object:nil];
Publikowanie powiadomienia z danymi
Szybki
let userInfo: [String: AnyObject] = ["someKey": myObject]
NSNotificationCenter.defaultCenter().postNotificationName("TestNotification", object: self, userInfo: userInfo)
Cel C
NSDictionary *userInfo = [NSDictionary dictionaryWithObject:myObject forKey:@"someKey"];
[[NSNotificationCenter defaultCenter] postNotificationName: @"TestNotification" object:nil userInfo:userInfo];
Obserwacja powiadomienia
Szybki
func testNotification(notification: NSNotification) {
let userInfo = notification.userInfo
let myObject: MyObject = userInfo["someKey"]
}
Cel C
- (void)testNotification:(NSNotification *)notification {
NSDictionary *userInfo = notification.userInfo;
MyObject *myObject = [userInfo objectForKey:@"someKey"];
}
Dodawanie / usuwanie obserwatora z blokiem
Zamiast dodawać obserwatora za pomocą selektora, można użyć bloku:
id testObserver = [[NSNotificationCenter defaultCenter] addObserverForName:@"TestNotification"
object:nil
queue:nil
usingBlock:^(NSNotification* notification) {
NSDictionary *userInfo = notification.userInfo;
MyObject *myObject = [userInfo objectForKey:@"someKey"];
}];
Następnie można usunąć obserwatora za pomocą:
[[NSNotificationCenter defaultCenter] removeObserver:testObserver
name:@"TestNotification"
object:nil];
Dodaj i usuń obserwatora dla nazwy
// 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)