我的应用程序从服务器下载内容包,我希望在应用程序处于后台时继续下载。但是我想知道当应用程序移动到后台但在任务完成之前,应用程序再次进入前台时,处理任务及其配置的UIBackgroundTaskIdentifier的正确方法。
我有一个模型类进行下载(使用NSURLConnection)并且它有一个UIBackgroundTaskIdentifier属性,该模型已在UIApplicationDidBecomeActiveNotification和UIApplicationDidEnterBackgroundNotification的通知中心注册。
我正在考虑调用beginBackgroundTaskWithExpirationHandler:在UIApplicationDidBecomeActiveNotification的通知处理程序中,因为当应用程序在前台时开始下载,然后当应用程序移动到后台时,因为在下载启动之前已经调用了beginBackgroundTaskWithExpirationHandler我不知道需要做任何事情,下载应该在后台继续。
对beginBackgroundTaskWithExpirationHandler的调用将UIBackgroundTaskIdentifier分配给模型的属性。
如果任务在后台完成,或者在完成之前用完了,那么我将使用模型的UIBackgroundTaskIdentifer调用endBackgroundTask。然后,下次应用程序进入前台时,将再次调用beginBackgroundTaskWithExpirationHandler,并生成一个新的UIBackgroundTaskIdentifier并将其分配给模型的属性。
但我的问题是,如果应用程序移动到后台然后在任务完成之前返回到前台,我该怎么办?如果我没有做任何特殊处理这种情况的事情,那么将再次调用behginBackgroundTaskWithExpirationHandler并且将覆盖UIBackgroundTaskIdentifier属性的旧值。 我认为这很糟糕?因此,在第二次调用beginBackgroundTaskWithExpirationHandler之前,我是否需要在必要时调用endBackgroundTask?或者有取消方法,或一些推荐的最佳做法?
TIA
答案 0 :(得分:0)
您可以先备份应用程序并提前终止任务:
//Observe the application becoming active
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(observer_UIApplicationDidBecomeActiveNotification:) name:UIApplicationDidBecomeActiveNotification object:nil];