iOS
NSNotificationCenter
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. |
kö | 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
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)