我正在编写一个使用GCD计时器源的Objective-C包装器.其中一个目标是包装器在应用程序进入后台时管理暂停计时器源.
docs for – [UIApplicationDelegate applicationDidEnterBackground:]表示它应该用于使计时器无效,等等;我正在松散地解释这个(也许这是我的问题的根源?)因为我正在暂停GCD计时器(dispatch_suspend())以响应UIApplicationDidEnterBackgroundNotification).
当初始化包装器的实例时,它检查[UIApplication sharedApplication] .applicationState!= UIApplicationStateBackground以确定GCD计时器源是否应该最初作为初始化序列的一部分恢复.它还注册UIApplicationDidEnterBackgroundNotification和UIApplicationWillEnterForegroundNotification,它用于暂停和恢复计时器源(分别).
我观察到的问题是,似乎有些情况下,在初始化期间检查[UIApplication sharedApplication] .applicationState!= UIApplicationStateBackground,以便恢复计时器源,并且接收的下一个通知是UIApplicationWillEnterForegroundNotification,这会导致计时器源第二次恢复.这导致崩溃,因为计时器在第二次恢复时没有暂停.
我可以通过在本地跟踪应用程序状态并确认可能重复的转换来解决这个问题,但我担心我可能做错了什么或者可能存在错误(无论是在实现中还是在文档中).
最佳答案 这是应用程序状态的工作方式:
在首次发布时,
> application:didFinishLaunchingWithOptions
> applicationDidBecomeActive
当你按下主页按钮时,
> applicationWillResignActive
> applicationDidEnterBackground
当您打开背景应用时,
> applicationWillEnterForeground
> applicationDidBecomeActive
打开 – (初始启动和打开后台应用程序) – applicationDidBecomeActive被调用 – 在这里初始化计时器.
隐藏或接听电话等 – 在此处调用applicationWillResignActive – 停止计时器.
希望这可以帮助.