条件

  • 获取通知(txt消息)
  • 或打开/关闭通知中心
  • 或切换到另一个应用程序,再返回

  • 基本上,该应用会在短时间内从后台恢复。

    问题

    布局还可以,但是从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/

    10-14 23:39
    查看更多