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

NSNotification & NSNotificationCenter w Swift

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)


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow