【问题标题】:IOS - Executing a Finite-Length Task in the BackgroundIOS - 在后台执行有限长度的任务
【发布时间】:2013-04-23 08:47:51
【问题描述】:

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

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

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

[self multipartUpload];}

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

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

【问题讨论】:

  • 你可以使用线程来实现它我想是的......

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


【解决方案1】:

你确定你是第二次调用 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;
      }];
   }
}

【讨论】:

  • 我没有第二次调用它。我已经编辑了上面的代码。请参考。当我再次调用它时,上传操作会发生 rt?我不希望这种情况发生。我只需要注册而无需第二次调用上传。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-26
  • 2018-01-12
  • 1970-01-01
相关资源
最近更新 更多