IOS - 在后台执行有限长度的任务

时间:2013-04-23 08:47:52

标签: ios objective-c sync background-process multitasking

我正在编写一个同步数据的iOS应用。我还需要在应用程序处于后台时运行同步服务。所以我在我上传数据的地方编写了这段代码。

 - (void)startAsyncUpload {
UIApplication *thisApplication = [UIApplication sharedApplication];

if([thisApplication respondsToSelector:@selector(beginBackgroundTaskWithExpirationHandler:)]) {
    bgTaskIdentifier_ = [thisApplication beginBackgroundTaskWithExpirationHandler:^(void)
                         {
                             [thisApplication endBackgroundTask:bgTaskIdentifier_];
                             bgTaskIdentifier_ = UIBackgroundTaskInvalid;
                         }];
}

[self multipartUpload];}

它工作正常并在后台运行。但我在这里遇到了问题。我正在上传一个视频文件,当我的后台时间到期时,处理程序被调用,它结束了任务。现在当我来到前台再次上传恢复,很好。但是现在当我再次进入后台时,它并没有恢复后台任务。

我知道为什么,主要是因为我之前结束了这项任务。但有没有办法再次恢复任务,比如再次为后台运行注册任务?

1 个答案:

答案 0 :(得分:2)

你确定你第二次调用beginBackgroundTaskWithExpirationHandler吗?

为bgTaskIdentifier创建一个ivar / property,为BOOL isUploading创建一个ivar / property。然后你可以写一个像这样的方法

- (void)resumeOrStartAsyncLoad 
{
   if(!self.isUploading) 
   {
      [self multipartUpload];
      self.isUploading = TRUE;
   }

   if(self.isUploading && self.bgTaskIdentifier == UIBackgroundTaskInvalid) 
   {
      UIApplication *thisApplication = [UIApplication sharedApplication];
      self.bgTaskIdentifier = [thisApplication beginBackgroundTaskWithExpirationHandler:^(void) {
         [thisApplication endBackgroundTask:bgTaskIdentifier_];
         bgTaskIdentifier_ = UIBackgroundTaskInvalid;
      }];
   }
}