1

In meiner iOS Anwendung, posten ich eine NSNotification und fange es in einem meiner UIView im Haupt-Thread. Ich möchte zusätzliche Informationen zusammen mit der Benachrichtigung weitergeben. Ich benutzte userInfo Wörterbuch von NSNotification dafür.Objektparameter in der Methode postNotification von NSNotificationCenter

Schlüssel, Wert, Farbe und Zeit sind lokale Variablen, die den Wert enthalten, den ich übergeben muss. In UIView I Beobachtern ist Zugabe für diese Meldung und ich bin mit notification.userInfo diese Daten

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receiveNotification:) name:@"NotifyValueComputedFromJS" object:nil]; 

-(void)receiveNotification:(NSNotification *)notification 
{ 
    if ([notification.userInfo valueForKey:@"notificationKey"]!=nil && [[notification.userInfo valueForKey:@"notificationKey"] isEqualToString:self.notificationKey] && [notification.userInfo valueForKey:@"notificationValue"]!=nil) { 
     [self updateLabelWithValue:[notification.userInfo valueForKey:@"notificationValue"]]; 
    } 
} 

Die Frequenz zu erhalten, in dem diese Mitteilung veröffentlicht wird, ist 4-mal in einer Sekunde. Ich mache einige Animationen auch im Hauptthread. Das Problem, mit dem ich hier konfrontiert bin, ist, dass meine Benutzeroberfläche zurückbleibt. Die Benutzeroberfläche reagiert auf Scroll-Ereignisse oder berührt Ereignisse mit großer Verzögerung (ich hatte sogar eine Verzögerung von 1 bis 2 Sekunden). Nach einigen Recherchen habe ich erfahren, dass NSDictionary sperrig ist und Lag verursachen wird, wenn es im Hauptfaden verwendet wird. Gibt es eine andere Möglichkeit, wie ich meine Daten über NSNotification weitergeben kann?

Ich habe einen anderen Weg ausprobiert. Ich habe eine benutzerdefinierte NSObject Klasse erstellt, um die Daten zu speichern, die ich möchte, und ich übergebe es als Objektparameter der postNotification Methode.

[[NSNotificationCenter defaultCenter] postNotificationName:@"NotifyValueComputedFromJS" object:customDataObject userInfo:nil]; 

Hier customDataObject ist eine Instanz meiner benutzerdefinierten NSObject Klasse. Ich weiß, dass der Parameter der Absender der Benachrichtigung sein soll (normalerweise wird es selbst sein). Ist es ein falscher Ansatz, wenn ich ein benutzerdefiniertes Objekt als Parameter sende?

Antwort

2

Wie BobDave erwähnt, besteht der Schlüssel darin, die Benachrichtigung in einem anderen Thread als dem Hauptthread der Benutzeroberfläche zu senden. Dies kann mit dispatch_async oder mit einer Warteschlange erreicht werden.

Das typische Muster für dieses Verhalten ist, Absender:

-(void)sendDataToObserver { 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
     [[NSNotificationCenter defaultCenter] postNotificationName:@"NotifyValueComputedFromJS" object:customDataObject userInfo:userInfo:@{@"notificationKey":key,@"notificationValue":value,@"notificationColor":color,@"notificationTimeStamp":time}]; 
    }); 
} 

und Empfänger (HINWEIS: schwaches Selbst weil Zyklen beibehalten):

-(void)addObserver { 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receiveNotification:) name:@"NotifyValueComputedFromJS" object:nil]; 
} 

-(void)receiveNotification:(NSNotification *)notification { 
    if ([notification.userInfo valueForKey:@"notificationKey"]!=nil && [[notification.userInfo valueForKey:@"notificationKey"] isEqualToString:self.notificationKey] && [notification.userInfo valueForKey:@"notificationValue"]!=nil) { 
     __weak typeof (self) weakSelf = self; 

     dispatch_async(dispatch_get_main_queue(), ^{ 
      [weakSelf updateLabelWithValue:[notification.userInfo valueForKey:@"notificationValue"]]; 
     }); 
    } 
} 
+0

Danke soviel @ Lytisch. Vielen Dank für die Bereitstellung des Beispielcodes :) –

1

Vielleicht könnten Sie - addObserverForName:object:queue:usingBlock:

verwenden und eine Nicht-Haupt-Warteschlange verwenden Sie den Block auszuführen, um die Verzögerung zu reduzieren. Sollte der Beobachter nicht in einem UIViewController und nicht in einem UIView hinzugefügt werden?

+0

Vielen Dank @BobDave –

Verwandte Themen