2

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

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

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

[self multipartUpload];}

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

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

4

1 回答 1

2

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

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

- (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;
      }];
   }
}
于 2013-04-23T10:04:10.513 回答