2011-12-15 5 views
0

Мое приложение состоит из appdelegate и нескольких viewcontrollers.Как appdelegate вызывать метод viewcontroller?

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

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

Спасибо.

+2

Я бы пошел с уведомлениями - вы можете позже переместить задание cron в любом месте и не переписывать делегатов и протоколы. NSNotifications просты в реализации и преуспевают в таких сценариях. –

ответ

2

У меня было то же требование, что и вы несколько дней назад. Сначала я пошел с уведомлениями, те, которые вы отправляете и получаете с помощью [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

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

0

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

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