在我的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
类的实例。我知道参数是通知的发送者(通常是自己的)。如果我将自定义对象作为参数发送,这是一种错误的方法吗?
答案 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?