2012-07-06 23 views
0

這是當應用程序進入後臺我如何啓動一個後臺任務,SendSynchronousRequest觸發背景到期處理 - IOS

void applicationDidEnterBackground:(UIApplication *)application 
{ 
    btId = UIBackgroundTaskInvalid; 
    UIApplication* cuiApplication = [UIApplication sharedApplication]; 

    void (^backgroundTimeRemainingExtenderHandler)() = ^() { 

     NSTimeInterval timeRemaining1 = [cuiApplication backgroundTimeRemaining]; 

     if(btId != UIBackgroundTaskInvalid){ 
      [proximityEngine StopEngine]; 
      [cuiApplication endBackgroundTask:btId]; 
      btId = UIBackgroundTaskInvalid; 
     } 
    }; 

    btId= [cuiApplication beginBackgroundTaskWithExpirationHandler:backgroundTimeRemainingExtenderHandler]; 

    if(bgmanager != nil){ 
     [bgmanager BeginBackgroundTaskMainLoop]; 
    } 
} 

我的問題是,當我的後臺任務要求:

NSURLConnection的sendSynchronousRequest

即使有更多時間重新調用過期塊,但我怎樣才能防止這種情況?

問候,

詹姆斯

編輯:我仍然有查詢的時間留給量時,但仍然IOS調用過期塊處理剩下596秒:

閱讀下面的答案後。

回答

1

在我特別的情況下 - 我不太確定它爲什麼會表現出它的行爲方式,我在與beginbackgroundtask線程不同的線程上執行任務,在該線程中發回的同步後,backgroundtask被操作系統中斷。 當在beginbackground原始線程中調用sentync時,它不會發生。 不知道它是否合乎邏輯,我做錯了什麼或操作系統錯誤。

+0

可以UPVOTE百萬倍!救了我!!!謝謝!!! – 2014-05-22 07:54:51

+0

我認爲發生的事情是,因爲你的應用程序是在後臺,它所有的線程目前都在睡覺或者不存在......當你從操作系統調用時,應用程序會用一個後臺線程喚醒...它可能不會允許您打開其他線程,因爲這可能會永遠存在,所以它只會觸發到期處理程序。 – 2014-05-22 07:58:35

1

beginBackgroundTaskWithExpirationHandler:是應用程序請求一點額外的背景時間來做一些整理作爲進入後臺的結果。但是,iOS保留決定提供多少時間的權利(如果有的話),並且如果您未能在規定的時間內結束,則會終止您的流程。

你不會無限期地在後臺執行,你不會選擇自己的時間限制。你可以通過backgroundTimeRemaining來查詢你已經分配了什麼,但這幾乎是完全的。

the documentation處理程序在應用程序的剩餘後臺時間到達之前不久調用。所以你應該預期backgroundTimeRemaining不完全是零。

這就是說,如果你的URL連接還沒有完成,那麼你只是想指出它沒有完成,並在下次你從背景回來時處理錯誤,通常是通過再次嘗試。這就是你的到期處理程序應該做的事情,它需要快速完成。

然而,分配給您的應用程序的額外時間是不可協商的。

+0

查詢剩餘時間量還剩下596秒,但IOS仍然呼叫過期塊處理程序。 它發生在同步完成後.. – 2012-07-06 10:08:33