2013-04-23 47 views
2

我正在写一个同步数据的iOS应用程序。我需要同步服务才能在应用处于后台时运行。所以我在我上传数据的地方写了这段代码。IOS - 在后台执行有限长任务

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

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

[self multipartUpload];} 

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

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

+0

你可以使用线程来实现它我想这样... – 08442 2013-04-23 09:37:18

+0

如何,你能解释一下吗? – Advaith 2013-04-23 10:11:14

回答

2

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

为bgTaskIdentifier创建一个ivar /属性,并为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; 
     }]; 
    } 
} 
+0

我不是第二次打电话给它。我编辑了上面的代码。请参考。当我第二次再次调用上传操作时,会发生什么?我不希望发生这种情况。我只需要注册而不需要第二次上传。 – Advaith 2013-04-23 10:08:33

+0

查看我的更改! – hfossli 2013-04-23 15:36:55

+0

谢谢:)它的工作原理 – Advaith 2013-04-24 09:46:29