当前位置: > > > Swift - 程序进入后台,以及应用终止时调用的方法

Swift - 程序进入后台,以及应用终止时调用的方法

在AppDelegate中有如下两个方法要注意:
applicationDidEnterBackground()  当应用进入后台时起作用
applicationWillTerminate()  当应用终止的时候起作用

有了这两个方法,我们就可以对程序数据进行保护。
比如当应用崩溃,内存不足被系统终止,程序在后台呆太久被终止掉时,可以通过这两个方法对操作数据进行保存,以免数据丢失。
import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    func application(application: UIApplication,
        didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        return true
    }
  
    //当应用进入后台时其作用
    func applicationDidEnterBackground(application: UIApplication) {
       saveData()
    }
    
    //当应用终止的时候起作用
    func applicationWillTerminate(application: UIApplication) {
        saveData()
    }
    
    func saveData(){
        //获取导航控制器
        let navigation = self.window?.rootViewController as UINavigationController
        //获取导航控制器的根视图控制器
        var controller:ViewController = navigation.viewControllers.first! as ViewController
        //执行ViewController的自定义数据保存方法
        controller.saveData()
    }
    
    func applicationWillResignActive(application: UIApplication) {
    }

    func applicationWillEnterForeground(application: UIApplication) {
    }

    func applicationDidBecomeActive(application: UIApplication) {
    }
}
注意:self.windows表示storyboard中的UIWindow对象,也是所有视图的总容器。在iOS应用中只有一个UIWindow对象。
如果我们给导航控制器勾选了is Initial View Controller属性,UIWindow对象的rootViewController获取的就是勾选了is Initial View Controller属性的导航控制器。
评论2
  • 2楼
    2016-05-06 00:36
    Sean

    站长你好 想请问应用再退出之后再重新进入后,程序上次运行时的数据就全部丢失了嘛? 还有我在用模拟器模拟退出应用之后就无法再进入程序了 是不是必须要用真机调试啊? 最后就是你在文章中提到的saveData 在具体实现数据存储的时候是用什么方法实现的 能否具体说明一下? 谢谢

    站长回复

    应用退出之后再重新进入,运行时的数据如果没有保存肯定都会丢失的。不仅是退出,就算你是按home键让程序进入后台,时间长了也有可能被系统停止运行,造成数据丢失。
    这个用真机调试会好些,不过模拟器也没问题,退出后点图标还是可以启动程序的。 

    保存数据的方法很多: 
    2,保存到Core Data中:Swift - 使用Core Data进行数据持久化存储
    还可以保存到sqlite、realm等数据库中去(这些我也写过相关文章,你可以使用站内搜索功能搜索下)

  • 1楼
    2016-04-27 10:43
    linjoe

    站长:如果我要是按下home键,叫他在后台跑着,用您的方法可以一直跑我上滑结束程序是嘛?

    站长回复

    不会一直在后台无限制地跑下去的,所以这个只能做一些短时间的收尾工作。不过可以申请稍微延长下后台运行任务时间(但也不能超过10分钟),可以参考我原来写的这篇文章:Swift - 让程序挂起后,能在后台继续运行任务