避免在App Delegate中重复执行代码

时间:2015-02-03 14:17:57

标签: ios objective-c push-notification appdelegate

我的App Delegate中有一段代码通知我的第一个View Controller用户希望立即显示某些内容:

- (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发送到View Controller。

两个问题:

如何通过在我的App Delegate中重复调用notifyAppWithURL来解决此问题?

此外,是否有更好,更广泛的解决方案来处理来自用户的多个传入操作(然后触发其他一些操作)?

1 个答案:

答案 0 :(得分:1)

documentation for application:openURL:sourceApplication:annotation:说明如下:

  

如果您的应用必须启动才能打开网址,应用会先调用application:willFinishLaunchingWithOptions:application:didFinishLaunchingWithOptions:方法,然后再使用此方法。

您收到第一个通知是因为您在notifyAppWithURL:中拨打了application:didFinishLaunchingWithOptions:,而第二个是因为您在application:openURL:sourceApplication:annotation:中呼叫了该通知。一个简单的解决方案是简单地删除application:didFinishLaunchingWithOptions:中的呼叫。

就您的第二个问题而言,处理多个操作并不是一般的方法,导致某些代码运行两次或更多次。 dispatch_once是确保代码块在整个过程中运行一次且仅运行一次的标准方法,但这显然不是您想要的。