2015-02-03 26 views
1

У меня есть кусок кода в моей App делегат, который уведомляет мой первый View Controller, который пользователь хочет, чтобы показать что-то сразу:Избегайте дублирования выполнения кода в App Делегат

- (void)notifyAppWithURL:(NSURL *)url { 
    if(!url){ 
     return; 
    } 
    NSDictionary *dict = [self parseQueryString:[url query]]; 
    NSString *host = [url host]; 
    [self notifyApp:host value:dict[@"id"]]; 
} 

- (void)notifyApp:(NSString *)key value:(NSString *)value { 
    [UIApplication sharedApplication].applicationIconBadgeNumber = 0; 
    [[NSNotificationCenter defaultCenter] postNotificationName:@"ShowOnLoad" object:nil userInfo:@{ 
                            key : value 
                            }]; 
} 

Что я вызвать из didReceiveRemoteNotification & openURL методы делегата. Все отлично работает с этими двумя.

Тем не менее, кажется, что если приложение является закрытым, и этот метод называется:

didFinishLaunchingWithOptions и я помещаю один и тот же вызов:

if(launchOptions[UIApplicationLaunchOptionsURLKey]){ 
    [self notifyAppWithURL:launchOptions[UIApplicationLaunchOptionsURLKey]]; 
} 

внутри, а затем два NSNotification «s отправляются в Контроллер просмотра.

Два вопроса:

Как я могу решить эту проблему с повторяющимися вызовами notifyAppWithURL в моем App делегатом?

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

ответ

1

The documentation for application:openURL:sourceApplication:annotation: говорит следующее:

Если ваше приложение должно было быть запущен, чтобы открыть URL, приложение вызывает application:willFinishLaunchingWithOptions: и application:didFinishLaunchingWithOptions: методы первой, а затем с помощью этого метода.

Вы получаете первое уведомление, потому что вы звоните notifyAppWithURL: в application:didFinishLaunchingWithOptions:, а второй потому, что вы называете его в application:openURL:sourceApplication:annotation:. Простым решением было бы просто удалить вызов в application:didFinishLaunchingWithOptions:.

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

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