1

В моем приложении iOS я размещаю NSNotification и поймаю его в одном из моих UIView в основной теме. Я хочу передать дополнительную информацию вместе с уведомлением. Я использовал userInfo словарь NSNotification.Параметр объекта в методе postNotification of NSNotificationCenter

[[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 раза в секунду. Я также делаю анимацию в основном потоке. Проблема, с которой я здесь сталкиваюсь, - это мой пользовательский интерфейс. Пользовательский интерфейс будет реагировать на события прокрутки или события касания с огромной задержкой (я столкнулся с задержкой даже от 1 до 2 секунд). После некоторых исследований я узнал, что NSDictionary громоздкий и вызовет лаг при использовании в основном потоке. Есть ли другой способ передачи моих данных через NSNotification?

Я пробовал другой способ. Я создал собственный класс NSObject, чтобы сохранить данные, которые я хочу, и передаю его как параметр объекта postNotification.

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

Здесь customDataObject это экземпляр моего пользовательского класса NSObject. Я знаю, что параметр предназначен для отправителя уведомления (обычно это будет само). Это неправильный подход, если я отправляю пользовательский объект в качестве параметра?

ответ

2

Как упоминалось в BobDave, ключ должен отправить уведомление в какой-либо поток, отличный от основного потока пользовательского интерфейса. Это может быть выполнено с помощью 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"]]; 
     }); 
    } 
} 
+0

Спасибо так много @ Литическая. Спасибо за предоставление примера кода :) –

1

Может быть, вы могли бы использовать - addObserverForName:object:queue:usingBlock:

и использовать не основную очередь, чтобы выполнить блок для того, чтобы уменьшить отставание. Кроме того, не следует ли добавлять наблюдателя в UIViewController, а не в UIView?

+0

Большое спасибо @BobDave –

 Смежные вопросы

  • Нет связанных вопросов^_^