Как передать информацию из appDelegate в один из контроллеров представления в UINavigationcontroller - PullRequest
2 голосов
/ 03 июня 2009

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

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

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

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

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

Ответы [ 2 ]

2 голосов
/ 02 марта 2012

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

В viewDidLoad (я попытался переопределить init, но у меня это не получилось) - я зарегистрировал свой 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";
}

В моей «модели» [не делегат приложения - я создал новый класс, который я использую для обнаружения устройств «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.

2 голосов
/ 03 июня 2009

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

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

В вашем случае это будет выглядеть так:

Заголовок 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...