![](/img/trans.png)
[英]Long-running task performed in foreground is suspended when app enters background
[英]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.