【问题标题】:How much time do I have after applicationDidEnterBackground invoked?调用 applicationDidEnterBackground 后我有多少时间?
【发布时间】:2013-04-28 20:28:46
【问题描述】:

我想给远程服务器发送一个时间戳,等待成功的回调,如果远程服务器没有响应,则将时间戳存储在本地。

我可以将其放入applicationDidEnterBackground 实现中吗?

【问题讨论】:

    标签: ios background-process uiapplicationdelegate springboard


    【解决方案1】:

    根据 iOS 开发者库UIApplicationDelegate Protocol Reference

    您实施此方法大约需要 5 秒时间 执行任何任务并返回。如果您需要额外的时间来执行 任何最终任务,您都可以从 系统通过调用 beginBackgroundTaskWithExpirationHandler:。在 练习,你应该从 applicationDidEnterBackground: 返回 尽快。如果方法在时间运行之前没有返回 你的应用程序被终止并从内存中清除。

    您应该执行与调整用户界面相关的任何任务 在此方法退出之前,但其他任务(例如保存状态)应该 根据需要移动到并发调度队列或辅助线程。 因为它可能是您开始的任何后台任务 applicationDidEnterBackground: 在该方法之后才会运行 退出,您应该在之前请求额外的后台执行时间 开始这些任务。换句话说,首先调用 beginBackgroundTaskWithExpirationHandler: 然后在一个任务上运行 调度队列或辅助线程。

    因此,您有大约 5 秒 来执行任何任务并在“applicationDidEnterBackground”方法中返回。

    【讨论】:

      【解决方案2】:

      如果您想在进入后台之前做任何网络工作,您应该向beginBackgroundTaskWithExpirationHandler: 请求额外的时间。

      【讨论】:

        【解决方案3】:

        您可以在 dispatch_async 中执行此操作,您可以等待服务器应答并对您的数据执行某些操作,但您无法停止进入后台...

        试试这个代码

        dispatch_queue_t savingQueue = dispatch_queue_create("savingQue", NULL);
        dispatch_async(savingQueue, ^{
        
           //do something in bg.... 
        
            dispatch_async(dispatch_get_main_queue(), ^{
        
        
            });
        
        });
        dispatch_release(savingQueue);
        

        【讨论】:

        • 即使在 ARC 中也需要发布吗?
        • 好像没有。我认为它稍后会发布。
        猜你喜欢
        • 2020-12-17
        • 2012-05-22
        • 1970-01-01
        • 2018-09-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多