簡體   English   中英

當應用程序進入前台時取消后台任務

[英]Cancel background task when app enters foreground

在我的應用程序中,當用戶關閉應用程序(即它進入后台)時,我正在將數據與服務器同步。 此過程大約需要一分鍾,並且涉及對服務器的各種調用以上載數據,因此我選擇將其作為后台線程執行。

- (void)applicationDidEnterBackground:(UIApplication *)application {

    bgTask = [application beginBackgroundTaskWithExpirationHandler:^{
        [application endBackgroundTask:bgTask];
        bgTask = UIBackgroundTaskInvalid;
    }];

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        [asynchronousAPIController processQueueOrWaitWithIsBackgroundSync:true];

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

除非用戶在此同步期間(即在第一分鍾內)重新進入前景,否則此工作正常。 想要的是后台同步終止完成 - 即使它在同步的中途也停止同步。 當應用程序接下來進入后台時,它可以從頭開始重啟整個過程,沒問題。

我試過用這個:

- (void)applicationWillEnterForeground:(UIApplication *)application {
    if (bgTask != UIBackgroundTaskInvalid) {
        [application endBackgroundTask:bgTask];
        bgTask = UIBackgroundTaskInvalid;
    }
}

但它並沒有阻止同步 - 只是繼續前進。 幾乎就像它一旦開始它就繼續前進。

我懷疑它可能是因為控制同步的對象是一個單例 - 也就是說它不是一個可以被破壞的類對象,而是一個單例,所以可能因此而保持活着。 這會有所作為嗎?

或者我只是做錯了什么?

任何建議,非常感謝。

您需要在NSOperation中完成后台工作。 我將創建一個NSBlockOperation並將其添加到NSOperationQueue。 這樣就可以自動生成后台線程。 對於復雜的操作,創建一個NSOperation子類。 在NSOperation代碼內部檢查操作是否定期取消(例如在for循環內),如果是,則退出代碼塊(在for循環中: if ([operation isCanceled]) break; )。 在applicationWillEnterForeground中只需取消操作即可。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM