2012-06-12 89 views
3

我試圖增加對退出我的iOS應用前景後,完成任務的支持。所有我在互聯網上看到了教程,點我的應用程序委託寫這樣的事情:iOS的後臺任務完成編程

- (void)applicationDidEnterBackground:(UIApplication *)application { 
    if ([[UIDevice currentDevice] isMultitaskingSupported]) { 
     UIApplication *application = [UIApplication sharedApplication]; 
     __block UIBackgroundTaskIdentifier background_task; 
     background_task = [application beginBackgroundTaskWithExpirationHandler:^{ 
      [application endBackgroundTask: background_task]; 
      background_task = UIBackgroundTaskInvalid; 
     }]; 

     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 

      //DO STUFF IN BACKGROUND HERE 
      MyTask *task = [[MyTask alloc] initWithURL:@"http://google.com"]; 
      [task setDelegate:self]; 
      [task start]; 

      [application endBackgroundTask: background_task]; 
      background_task = UIBackgroundTaskInvalid; 
     }); 
    } 
} 

的任務是能夠啓動,但啓動後,下一行被處理,我的應用程序被殺害。我能夠告訴你何時MyTask由於委託調用停止,但我怎麼改變我的程序,以便後臺任務被設置爲無效委託被調用後。我會移動

[application endBackgroundTask: background_task]; 
background_task = UIBackgroundTaskInvalid; 

到委託功能,還是我需要做別的事情。

預先感謝您的幫助, Guvvy

回答

6

您在每次呼叫後臺線程dispatch_async是已。該方法將立即返回,但您的塊將繼續運行。

您的問題似乎是您的啓動方法運行另一個異步進程,以便該方法立即返回,並且您的後臺任務在[task start]能夠做任何有意義的事情之前被殺死。

如果你在委託中去掉background_task的路由,你還需要創建一個ivar來存儲background_task,這樣你的委託方法才能到達它。這似乎有點沉重。

既然你在後臺線程是已經,我的建議是你要重構[task start]所以它是同步的。這樣,所有有意義的工作將在下一行被處理之前執行,並且background_task被殺死。這看起來更清晰,並且後臺任務的所有內容都很好地包裹在發送給dispatch_async的塊中。

+0

hi @ djibouti33你可以詳細說明你試圖說的話:「我的建議是重構[任務開始],所以它是同步的。」 。我在600秒後使用NStimer調用方法。但bgTask瞬間過期的應用程序進入後臺 –

+1

方法[任務開始]是一個異步方法,這意味着它立即返回(進行任何工作之前),然後background_task被打死。我使它同步,該方法將阻止任何其他執行,直到它完成,然後可以在正確的時間成功地終止background_task。 – djibouti33

-2

您可以下面的代碼完全刪除:

[application endBackgroundTask: background_task]; 
background_task = UIBackgroundTaskInvalid; 

當你的任務已經過期,iOS設備會打電話給你handlerExpiration方法將其殺死。 欲瞭解更多信息,請訪問Background for iOS

+0

這顯然是錯誤的。如果你沒有在指定的時間內調用endBackgroundTask:你的應用程序將被完全殺死,而不是在用戶眼中保持暫停和「啓動」。請參閱文檔https://developer.apple.com/library/ios/documentation/uikit/reference/UIApplication_Class/Reference/Reference.html#//apple_ref/occ/instm/UIApplication/endBackgroundTask: –