Как appdelegate может вызвать метод viewcontroller? - PullRequest
0 голосов
/ 15 декабря 2011

Мое приложение состоит из приложения и нескольких контроллеров представления.

В приложении выполняется задание cron (например, извлечение внешних данных). Когда данные обновляются, appdelegate необходимо обновить источник данных одного из viewcontroller и затем вызвать метод reloadData из этого viewcontroller?

Какой подход я должен использовать для решения проблемы? Является ли NSNotification хорошим способом? Как насчет протокола или делегата?

Спасибо.

Ответы [ 3 ]

2 голосов
/ 15 декабря 2011

У меня было такое же требование, как и у вас несколько дней назад.Сначала я пошел с уведомлениями, которые вы публикуете и получаете, используя [NSNotificationCenter defaultCenter].Но у меня были проблемы с этим подходом, по некоторым причинам я нашел это ненадежным и трудным для отладки.

Затем я реализовал что-то вроде этого: у меня есть класс, который обрабатывает все мои пользовательские уведомления.Этот класс содержит несколько массивов наблюдателей, например, массив содержит несколько контроллеров представления, которые хотят получать уведомления о каком-либо событии, другой массив содержит некоторые контроллеры представления, которые хотят получать уведомления о другом событии, и т. Д.

Когда вы создаете свой контроллер представления, который хотите быть наблюдателем какого-либо события, вы добавляете контроллер в связанный массив этого класса менеджера.

И затем, когда в делегате приложения происходит событие, вы говорите этому классу менеджера уведомить все контроллеры представления наблюдателя об этом событии.Затем этот класс менеджера выполняет итерацию в связанном массиве и вызывает некоторые определенные методы этих наблюдателей.Таким образом, для этого каждый контроллер представления, который заинтересован в одном и том же событии, должен иметь открытый метод с тем же именем, чтобы диспетчер уведомлений мог вызвать его.

Конечно, это можно улучшить, например, если эти контроллеры представлений, имеющие одинаковые интересы, реализуют протокол и т. Д.

Вот краткое изложение того, что я имею в виду.Это мой класс диспетчера уведомлений:

@interface NotificationUtility : NSObject

+(NSMutableArray *)getCallDurationObservers;
+(void)notifyCallDurationObservers;

@end

Это часть реализации:

#import "NotificationUtility.h"

static NSMutableArray *callDurationObservers = nil;

@implementation NotificationUtility

+(NSMutableArray *)getCallDurationObservers {
    if (callDurationObservers) {
        return callDurationObservers;
    }

    callDurationObservers = [[NSMutableArray alloc] init];
    return callDurationObservers;
}

+(void)notifyCallDurationObservers {
    for (TestViewController *observer in callDurationObservers) {
        [observer performSelector:@selector(updateCallDuration)];
    }
}

@end

И именно здесь я добавляю свои контроллеры представления, которые заинтересованы в наблюдении за продолжительностью вызова,в массив наблюдателей этого менеджера:

- (void)arrangeCallDurationObservers {
    NSMutableArray *callDurationObservers = [NotificationUtility getCallDurationObservers];
    [callDurationObservers removeAllObjects];
    [callDurationObservers addObject:_detail];
    [callDurationObservers addObject:_callReport];
}
1 голос
/ 15 декабря 2011

Я бы сказал, использовать делегат, когда есть отношение «ведущий / ведомый» (делегат знает о классе, а класс знает о делегате), когда на один класс выше иерархия управления, и когда становится ясно, что выиграл Не должно быть ситуаций, когда другие элементы (в основном пользовательский интерфейс) будут заинтересованы в том, чтобы знать, что должен сказать класс. Используйте уведомления, когда классу не интересно знать, кто слушает и сколько их, любой и любой номер может зарегистрироваться для получения уведомлений.

0 голосов
/ 15 декабря 2011

Я бы пошел с уведомлениями, чтобы сделать ваш код менее тесно связанным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...