Sök…


Introduktion

iOS-aviseringar är ett enkelt och kraftfullt sätt att skicka data på ett löst kopplat sätt. Det vill säga att avsändaren av en avisering inte behöver bry sig om vem (om någon) får meddelandet, den lägger bara ut där ute till resten av appen och den kan hämtas av massor av saker eller ingenting beroende på din apps tillstånd.

Källa : - HACKING med Swift

parametrar

Parameter detaljer
namn Namnet på meddelandet som observatören ska registreras för; det vill säga bara aviseringar med det här namnet används för att lägga till blocket i operationskön. Om du passerar noll använder inte meddelandecentret ett meddelande namn för att avgöra om det ska läggas till blocket i operationskön.
obj Det objekt vars meddelanden observatören vill ta emot; det vill säga bara aviseringar som skickas av denna avsändare levereras till observatören. Om du passerar noll använder inte meddelandecentret en avsändares avsändare för att avgöra om den ska levereras till observatören.
Den operationskö som blocket ska läggas till. Om du passerar noll körs blocket synkront på posttråden.
blockera Det block som ska utföras när meddelandet tas emot. Blocket kopieras av anmälningscentret och (kopian) som hålls tills observatörsregistreringen tas bort.

Anmärkningar

Ett NSNotificationCenter-objekt (eller helt enkelt, anmälningscenter) tillhandahåller en mekanism för att sända information inom ett program. Ett NSNotificationCenter-objekt är i huvudsak en anmälningssändningstabell.

Mer information finns i Apple-dokumentationen här

NSNotification & NSNotificationCenter i Swift

Lägga till en observatör

Namnkonvention

Meddelanden identifieras av globala NSString-objekt vars namn är sammansatta på detta sätt:

Name of associated class + Did | Will + UniquePartOfName + Notification

Till exempel:

  • NSApplicationDidBecomeActiveNotification
  • NSWindowDidMiniaturizeNotification
  • NSTextViewDidChangeSelectionNotification
  • NSColorPanelColorDidChangeNotification

Swift 2.3

NSNotificationCenter.defaultCenter().addObserver(self, 
                                                 selector: #selector(self.testNotification(_:)), 
                                                 name: "TestNotification", 
                                                 object: nil)

Snabb 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: Det är också värt att notera att antalet gånger en observatör har lagts till måste vara exakt antalet gånger observatören tas bort. Ett rookie-misstag är att lägga till observatören i viewWillAppear: av en UIViewController, men att ta bort observatören i viewDidUnload: kommer att orsaka ett ojämnt antal tryck och därmed läcka observatören och meddelandeväljaren på ett överflödigt sätt.

Ta bort observatörer

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)

Snabb 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];

Lägg ut ett meddelande

Snabb

NSNotificationCenter.defaultCenter().postNotificationName("TestNotification", object: self)

Objective-C

[[NSNotificationCenter defaultCenter] postNotificationName:@"TestNotification" object:nil];

Skicka ett meddelande med data

Snabb

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];

Observera en anmälan

Snabb

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"];
}

Lägga till / ta bort en observatör med ett block

I stället för att lägga till en observatör med en väljare kan ett block användas:

id testObserver = [[NSNotificationCenter defaultCenter] addObserverForName:@"TestNotification"
                                                                    object:nil 
                                                                     queue:nil 
                                                                usingBlock:^(NSNotification* notification) {
    NSDictionary *userInfo = notification.userInfo;
    MyObject *myObject = [userInfo objectForKey:@"someKey"];
}];

Observatören kan sedan tas bort med:

[[NSNotificationCenter defaultCenter] removeObserver:testObserver 
                                                name:@"TestNotification"
                                              object:nil];

Lägg till och ta bort observatören för namn

// 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
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow