【发布时间】:2014-01-27 16:52:12
【问题描述】:
当我的应用程序进入后台时,出于数据保护的原因,它必须模糊当前屏幕。屏幕内容不能在任务管理器窗口中看到,因此必须在应用退出之前完成模糊程序。每次 UI 更新时,必须在主循环上进行模糊处理。它只是在普通主视图上添加了一个模糊视图。但是,这需要一点时间才能完成,这就是问题所在。
按照 Apple 的建议,我从 applicationWillResignActive: 调用我的模糊例程。现在假设完成任务需要 0.2 秒。如果应用程序将在这么短的时间内重新激活,则不会调用 applicationDidBecomeActive: (这应该会再次使我的屏幕模糊,所以它会变得模糊)。
也许你认为在这么短的时间内“关闭”和“打开”一个应用程序不是正常的用户行为,但是想想点击屏幕的上边缘并向下移动一点,只是偶然的同时试图点击位于上边缘的按钮。这将在几分之一秒内激活通知中心。够了。
只是为了让这个问题变得透明,看看这个 AppDelegate,它将在控制台中发布不平衡的调用:
@implementation UHAppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
return YES;
}
- (void)applicationWillResignActive:(UIApplication *)application
{
NSLog(@"applicationWillResignActive - performing some tasks...");
// let the main loop do some work...
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.2]];
}
- (void)applicationDidEnterBackground:(UIApplication *)application
{
}
- (void)applicationWillEnterForeground:(UIApplication *)application
{
}
- (void)applicationDidBecomeActive:(UIApplication *)application
{
NSLog(@"applicationDidBecomeActive");
}
- (void)applicationWillTerminate:(UIApplication *)application
{
}
@end
在这种情况下如何实现对 applicationWillResignActive: 和 applicationDidBecomeActive: 的调用次数达到平衡...?
非常感谢您的帮助 乌多
【问题讨论】:
-
上面写的你的 applicationWillResignActive 什么都不做?
-
确实如此 - 它在控制台中发布一条注释并阻塞主循环 0.2 秒,就像主循环上的其他方法调用一样。
-
如果您以正常速度执行通知中心的“下拉”并让它再次向上翻转,您将获得平衡的通话记录(“applicationWillResignActive - 执行某些任务”,然后“翻转”:“applicationDidBecomeActive”)。但是,如果您只是在屏幕顶部快速“点击并向下翻转/向上翻转”,则只会出现“applicationWillResignActive - 执行某些任务”,尽管该应用已再次处于活动状态)
-
This chart 应该会有所帮助。但如果你说的是真的,它可能需要一些更新。
-
是的,如果应用程序仍未从 applicationWillEnterBackground 返回,iOS 似乎会放弃方法调用。
标签: ios iphone objective-c uikit uiapplicationdelegate