当iOS应用程序进入后台时,是否会暂停冗长的任务?

Jac*_*ale 70 iphone multitasking

是的,我知道如果我希望我的应用能够响应用户的多任务操作,例如切换到另一个应用,我应该处理

- (void)applicationWillResignActive:(UIApplication *)application
- (void)applicationDidBecomeActive:(UIApplication *)application
Run Code Online (Sandbox Code Playgroud)

如果我的应用程序正在进行相当长时间的操作(例如下载大文件)并且用户导致我的应用程序进入后台,该怎么办?当用户回到我的应用程序时,该操作是否会自动暂停并恢复?

当我的应用程序进入后台或在前台恢复时,幕后会发生什么?

如果用户让我的应用程序进入后台,我的应用程序的执行只是在方法的中间怎么办?

例如,我的应用程序正在做

for (int i = 1 to 10000K) {
    do some calculation;
}
Run Code Online (Sandbox Code Playgroud)

当i == 500K时,用户切换到另一个应用程序.我的应用程序中的for循环会发生什么?

Bra*_*son 74

iOS应用程序编程指南:

您的app delegate的applicationDidEnterBackground:方法大约需要5秒钟来完成任何任务并返回.实际上,这种方法应该尽快返回.如果方法在时间用完之前没有返回,那么您的应用程序将被终止并从内存中清除.如果仍需要更多时间来执行任务,请调用 beginBackgroundTaskWithExpirationHandler:方法以请求后台执行时间,然后在辅助线程中启动任何长时间运行的任务.无论您是否启动任何后台任务,该 applicationDidEnterBackground:方法仍必须在5秒内退出.

如果您在上面描述的长时间运行操作位于主线程上,并且在应用程序转到后台后需要超过5秒才能完成,您的应用程序将被终止.主线程将被阻止,您将无法及时返回-applicationDidEnterBackground:.

如果你的任务是在后台线程上运行(实际应该是,如果它需要很长时间才能执行),那么如果应用程序返回该线程似乎暂停-applicationDidEnterBackground:(根据本答复中的讨论).当应用程序返回到前台时,它将恢复.

但是,在后一种情况下,您仍然应该准备好在您的应用程序在后台通过在前往后台的路上清理时随时终止.


Ade*_*ain 11

如果你正在做一些可能消耗时间并且你不想杀死它的操作,那么你可以通过在UIBackground任务i中执行来延长你的操作时间.

{
    UIBackgroundTaskIdentifier  taskId = 0;
    taskId = [application beginBackgroundTaskWithExpirationHandler:^{
        taskId = UIBackgroundTaskInvalid;
    }];

// Execute long process. This process will have 10 mins even if your app goes in background mode.

}
Run Code Online (Sandbox Code Playgroud)

名为"handler"的块参数是后台任务到期时(10分钟)将发生的事情.这是文档的链接