我的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
来解决此问题?
此外,是否有更好,更广泛的解决方案来处理来自用户的多个传入操作(然后触发其他一些操作)?
答案 0 :(得分:1)
documentation for application:openURL:sourceApplication:annotation:
说明如下:
如果您的应用必须启动才能打开网址,应用会先调用
application:willFinishLaunchingWithOptions:
和application:didFinishLaunchingWithOptions:
方法,然后再使用此方法。
您收到第一个通知是因为您在notifyAppWithURL:
中拨打了application:didFinishLaunchingWithOptions:
,而第二个是因为您在application:openURL:sourceApplication:annotation:
中呼叫了该通知。一个简单的解决方案是简单地删除application:didFinishLaunchingWithOptions:
中的呼叫。
就您的第二个问题而言,处理多个操作并不是一般的方法,导致某些代码运行两次或更多次。 dispatch_once
是确保代码块在整个过程中运行一次且仅运行一次的标准方法,但这显然不是您想要的。