2013-04-23 46 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