如何让iOS系统等待App终止前的异步函数执行完成?
解决App终止前异步操作不被系统等待的问题
当通过UIApplication.willTerminateNotification监听App终止事件时,直接在回调里启动Task执行异步函数unMount(),系统不会等待异步任务完成——因为通知的perform闭包是同步执行的,闭包执行结束后,系统就会继续推进App终止流程,后台的Task会被直接终止。
结合你提到的Core Data查询耗时远低于5秒限制,有两种可行的解决方式:
方式一:阻塞等待异步任务完成
利用DispatchGroup在闭包内等待异步任务结束,同时设置不超过5秒的超时时间,符合Apple的限制要求:
SomeView().onReceive( NotificationCenter.default.publisher(for: UIApplication.willTerminateNotification), perform: { _ in let dispatchGroup = DispatchGroup() dispatchGroup.enter() Task { await unMount() dispatchGroup.leave() } // 最多等待5秒,避免触发系统强制终止 _ = dispatchGroup.wait(timeout: .now() + 5) } )
方式二:将异步逻辑改为同步执行
如果unMount()里的Core Data操作可以改为同步执行(注意确保Core Data操作的线程安全性,比如在主线程上下文执行查询),直接调用同步版本的函数即可,系统会等待闭包内的同步代码执行完毕:
// 先实现同步版本的Core Data操作函数 func unMountSync() { // 这里写同步的Core Data查询逻辑 } // 监听通知时调用同步函数 SomeView().onReceive( NotificationCenter.default.publisher(for: UIApplication.willTerminateNotification), perform: { _ in unMountSync() } )
需要注意:无论哪种方式,都要确保操作耗时不超过Apple规定的5秒,否则系统会强制终止App,未完成的操作依然会被打断。
内容的提问来源于stack exchange,提问作者Stopee
相关产品推荐
相关产品推荐

