条件
基本上,该应用会在短时间内从后台恢复。
问题
布局还可以,但是从CoreData获得的某些属性从Background恢复后为空。我的几乎所有视图控制器上都存在此问题。
项目
这是一个具有主选项卡控制器的应用程序,选项卡内有两个导航控制器,也许还有两个级别的视图控制器,它们本身具有子UIViews(使用某些信息)。后端由Parse和CoreData组成。
奇怪的部分
从后台返回-> viewWillAppear的属性正常(创建ID的备份)->它们在零秒后->我需要手动将其取回(从我刚刚存储的ID)
这是一个屏幕截图,在将断点放在每5秒调用一次的函数中以检查当前时间(link to bigger)时:
我做了什么
NSCoder实现了状态还原,每个视图控制器都有一个还原ID,但是当应用程序处于 Activity 状态时不会调用该ID。我认为NSCoder并不是问题所在,因为从文档中可以看出,当操作系统自行杀死NSCoder或迫使用户退出时,会使用它。
如果NSManagedObjects为nil,我尝试从NSNotificationCenter手动刷新适当的ViewControllers中的内容,但是它不是面向 future 的,并且在每个视图上都不是相同的逻辑。
有什么想法吗?谢谢!
我的AppDelegate:
- (void)applicationWillResignActive:(UIApplication *)application
{
NSLog(@"Will Resign Active");
}
- (void)applicationDidEnterBackground:(UIApplication *)application
{
NSLog(@"Entered Background");
}
- (void)applicationWillEnterForeground:(UIApplication *)application
{
NSLog(@"Will enter Foreground");
}
- (void)applicationDidBecomeActive:(UIApplication *)application {
[[NSNotificationCenter defaultCenter] postNotificationName:@"needsRefresh" object:self userInfo:nil]; // Helpful in some viewcontrollers to save variables that are not nil.
[PF_FBSession.activeSession handleDidBecomeActive];
}
- (void)applicationWillTerminate:(UIApplication *)application
{
NSLog(@"Will Terminate");
}
最佳答案
对于那些发现此线程的人,这是我找到的解决方案。
我的问题和答案是针对我的项目的。
我有另一个控制器,负责处理我所有的数据库连接,正在监听applicationDidBecomeActive。
这是在刷新我的数据,也是在进行“清理”,即删除/编辑一些NSManagedObjects,然后保存。
结论:内存地址不一样,对象不一样,因此在当前页面上为空。
我通过停止清理每个AppDidBecomeActive来解决此问题,而是将逻辑移至AppDidFinishLaunching。
希望能有所帮助!
关于iphone - 应用程序从后台恢复,NSManagedObject的nil属性恢复,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19276967/