2009-06-03 1 views
2

В приложении iphone, над которым я работаю, я использую настраиваемый класс для управления сетевой связью с хостом. Класс, называемый protocolClass, - это ivar в appDelegate и alloc + init в методе applicationDidFinishLaunching :.Как передать информацию из appDelegate в один из контроллеров представления в UINavigationcontroller

Теперь, когда протокол ClassCl получает данные от хоста, он вызывает метод protocolClassDidReceiveData: в своем делетете (который я установил как appDelegate). Мне нужно затем обновить данные в одном из customViewControllers в UINavigatorController.

Должен ли я просто добавить ссылку на customViewController, которую мне нужно обновить в appDelegate? или есть какой-то другой более эффективный метод?

Если бы я должен был ссылаться на customViewcontroller, каковы последствия использования памяти?

Заранее спасибо.

ответ

2

Если вы мне поняли, вы хотите обновить представление после того, как событие произойдет в какой-то несвязанной части вашей программы.

Чтобы уменьшить количество зависимостей в коде, я бы рекомендовал использовать NSNotification вместо более тесно связанной переменной экземпляра. Уведомления представляют собой концепцию Cocoa, которая позволяет одной части вашего кода генерировать событие-подобное сообщение, которое может регистрировать любое количество слушателей.

В вашем случае это будет выглядеть следующим образом:

AppDelegate Заголовок:

extern NSString* kDataReceived; 

реализация AppDelegate:

NSString* kDataReceived = @"DataReceived"; 

- (void)protocolClassDidReceiveData:(NSData*)data { 
    [[NSNotificationCenter defaultCenter] postNotificationName:kDataReceived 
                 object:self 
                 userInfo:data]; 
} 

в реализации какого-либо заинтересованного класса слушателя (например, ваш UIViewController) :

// register for the notification somewhere 
- (id)init 
{ 
    self = [super init]; 
    if (self != nil) { 
     [[NSNotificationCenter defaultCenter] addObserver:self 
               selector:@selector(dataReceivedNotification:) 
                name:kDataReceived 
                object:nil]; 
    } 
} 

// unregister 
- (void)dealloc 
{ 
    [[NSNotificationCenter defaultCenter] removeObserver:self]; 
} 

// receive the notification 
- (void)dataReceivedNotification:(NSNotification*)notification 
{ 
    NSData* data = [notification userInfo]; 
    // do something with data 
} 
+0

Спасибо, Николай, тогда я проверю уведомление. Первоначально я просто беспокоился об использовании notificationCenter, что означало использование ненужных системных ресурсов. – Ben

+0

Я думаю, что это была бы преждевременная оптимизация. Если вы посмотрите, сколько уведомлений пролетает со всех точек зрения, и поэтому я не думаю, что это нанесет какой-либо вред, чтобы отправить уведомление после получения данных из сокета. –

+0

Спасибо, Николай! Я был событием для googling, проходящим в iphone, и увидел ваш пост – ambertch

2

Да, уведомления - это хороший способ сделать это. И когда модель хочет обновить контроллер [т. ViewController] - уведомление - хороший способ сделать это. В моем случае я пытаюсь обнаружить устройства, использующие SSDP (используя AsyncUdpSocket), и я хотел обновить/уведомить контроллер своего вида, когда нашел устройство. Поскольку это асинхронно, когда данные получены, я использовал уведомление. Вот простая вещь, которую я сделал:

В viewDidLoad (я попытался перекрывая инициализации, но это не работает хорошо для меня) - я зарегистрировал ViewController для уведомления следующим образом:

*NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; 
    [nc addObserver:self 
      selector:@selector(foundController:) 
       name:@"DiscoveredController" 
      object:nil]; 

Вот селектор в моей ViewController:

// receive the notification 
- (void)foundController:(NSNotification *)note 
{ 
    self.controllerFoundStatus.text = @"We found a controller"; 
} 

в моей «модели» [Не App Делегат - я создал новый класс, который я использую для обнаружения устройств «serviceSSDP» все, что я сделал, чтобы отправить уведомление следующего :

[[NSNotificationCenter defaultCenter] postNotificationName:@"DiscoveredController" object:nil]; 

Всё.Это сообщение уведомления в когда я получаю правильный ответ на мое открытие SSDP [в частности, в:

- (BOOL)onUdpSocket:(AsyncUdpSocket *)sock 
    didReceiveData:(NSData *)data 
      withTag:(long)tag 
      fromHost:(NSString *)host 
       port:(UInt16)port 

в AsyncUdpSocket.

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