我的应用程序从服务器下载内容,一旦完成,它就会解析其内容,任何人都可以显示它。如果它显示了它,那么VC就会被推到导航堆栈上。
在处理内容的过程中,可能需要安排本地通知。当通知触发时,VC也被推到导航堆栈上以显示一些内容。
我有一个问题,本地通知立即过期-问题是在这种情况下,第二个VC的推送发生在第一个VC推送的viewDidPeare:执行之前。
我可以检测到通知是否会立即到期并添加延迟-但这似乎并不理想(添加计时器来解决问题从来都不是一个很好的解决方案IMO,添加多少延迟,如果在大多数情况下(但不是所有情况下)延迟足够多怎么办,所以让它更长时间来补偿,但第二个VC的推送可能会延迟,等等)
当通知触发时,我可以查看VC是否已被推送,如果是,它的viewDidAppear:是否已被调用,如果没有,则等待处理通知。
这是可行的,但要跟踪VC推送是否处于/处于什么阶段有点麻烦。有没有更优雅的解决方案?我宁愿避免在应用程序中添加另一个队列。
如果真的没有任何替代方案,那么延迟处理通知的选项是什么?例如,它们是否真的会与操作系统一起重新安排,以便在下一个运行循环中执行(这应该会给viewDidPeare:执行的机会)?
或者有必要使用navigationController:didShowViewController:animated:并检查和处理其中的通知队列吗?
还有其他选择吗?
感谢
你可以试试这个
- (void)pushVC {
@synchronized (self) {
HomeViewController *vc = [[[HomeViewController alloc] init] autorelease];
[self.navController pushViewController:vc animated:YES];
}
}
- (void)processLocalNotification:(UILocalNotification *)notification {
[self performSelector:@selector(pushVC) withObject:nil afterDelay:2.0f]; // delay for animation
}
另一种方法,检查现有通知,如果新通知太近,只需添加一些时间
UIApplication *app = [UIApplication sharedApplication];
for (UILocalNotification *notification in [app scheduledLocalNotifications]) {
}