Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/109.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
IOS-在后台执行有限长度的任务_Ios_Objective C_Sync_Background Process_Multitasking - Fatal编程技术网

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

IOS-在后台执行有限长度的任务,ios,objective-c,sync,background-process,multitasking,Ios,Objective C,Sync,Background Process,Multitasking,我正在编写一个iOS应用程序来同步数据。我需要同步服务运行时,应用程序是在后台以及。所以我在上传数据的地方写了这段代码 - (void)startAsyncUpload { UIApplication *thisApplication = [UIApplication sharedApplication]; if([thisApplication respondsToSelector:@selector(beginBackgroundTaskWithExpirationHandler:)])

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

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

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

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


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

您确定要第二次调用beginBackgroundTaskWithExpirationHandler:吗

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

- (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;
      }];
   }
}

您可以使用线程来实现它,我想是的……我不会再调用它了。我已经编辑了上面的代码。请参考。当我第二次调用它时,会发生上载操作吗?我不想发生这种事。我只需要注册,不需要第二次打电话上传。