NSNotificationCenter的方法postNotification中的对象参数

时间:2016-05-25 07:38:37

标签: ios objective-c nsdictionary nsnotificationcenter nsnotification

在我的iOS应用程序中,我发布了一个NSNotification并在主线程中的UIView之一中捕获它。我想传递额外的信息和通知。我正在使用userInfo NSNotification字典。

[[NSNotificationCenter defaultCenter] postNotificationName:@"NotifyValueComputedFromJS" object:self userInfo:@{@"notificationKey":key,@"notificationValue":value,@"notificationColor":color,@"notificationTimeStamp":time}];

键,值,颜色和时间是局部变量,包含我需要传递的值。在UIView我正在为此通知添加观察者,我使用notification.userInfo来获取这些数据

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

发布此通知的频率是一秒钟的4次。我也在主线程中做了一些动画。我在这里遇到的问题是我的UI是滞后的。 UI将响应滚动事件或触摸事件,延迟很大(我已经面临延迟甚至1到2秒)。经过一些研究后,我发现NSDictionary体积庞大,如果在主线程中使用会导致延迟。有没有其他方法可以通过NSNotification传递我的数据?

我尝试了另一种方式。我创建了一个自定义NSObject类来保存我想要的数据,并将其作为postNotification方法的对象参数传递。

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

此处customDataObject是我的自定义NSObject类的实例。我知道参数是通知的发送者(通常是自己的)。如果我将自定义对象作为参数发送,这是一种错误的方法吗?

2 个答案:

答案 0 :(得分:2)

正如BobDave所提到的,关键是在主UI线程以外的某些线程上发送通知。这可以使用dispatch_async或队列来完成。

此行为的典型模式是发件人:

-(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}];
    });
}

和接收者(注意:因为保留周期而自我弱):

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

答案 1 :(得分:1)

也许你可以使用- addObserverForName:object:queue:usingBlock:

并使用非主队列来执行块以减少延迟。此外,不应该将观察者添加到UIViewController中,而不是UIView?