2012-10-18 15 views
0

如果用戶更改了與推送通知相關的設置,我將在-applicationDidEnterBackground中啓動後臺任務,將數據上載到我的服務器。當用戶更改設置時,我將靜態BOOL設置爲YES,並僅在應用程序進入後臺時發送更改。我將一個結束任務的塊傳遞給方法,以便在達到connectionDidFinishLoading時調用它並結束任務。後臺任務有時在模擬器上失敗/總是在設備上失敗

它在模擬器上工作的時間最多,但不適用於實際設備。

相關代碼:

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

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),^
    { 
     [PushInfo checkDirty:^{ 
      NSLog(@"push info sent"); 
      [application endBackgroundTask:self.bgTask]; 
      self.bgTask = UIBackgroundTaskInvalid; 
     }]; 
    }); 
... 
// in PushInfo.m : 
typedef void (^VoidBlock)(); 
static BOOL dirty; 

+ (void) checkDirty:(VoidBlock)endBlock 
{ 
    if(dirty) 
    { 
     PushInfo *pi = [[PushInfo alloc] init]; 
     NSLog(@"sending pushinfo");    // This code is always reached 
     [pi setEndBlock:endBlock]; 
     [pi updatePushInfo]; 
    } 
    else 
     endBlock(); 
} 

- (void) updatePushInfo 
{ 
    ... 
    // Create a NSURLConnection to send the data 
    ... 
} 

- (void) connectionDidFinishLoading:(NSURLConnection *)connection 
{ 
    ... 
    NSLog(@"sent push info"); 
    dirty = NO; 
    if(endBlock) 
    { 
    endBlock(); 
    } 
} 

我失去了什麼? 編輯:即使它不將信息發送到服務器上的模擬器,靜態變量仍然是出於某種原因...

+0

當你說不會在設備上工作,你的意思是dispatch_async塊裏面從來沒有達到?你還測試了什麼設備? –

+0

我已經通過它了,它到達了我創建NSURLConnection的位置。之後,我無法在模擬器和設備上瀏覽代碼。我正在使用iOS 4和iOS 6模擬器的iPhone 4s(尚未在5.1模擬器上測試過) –

+0

作爲旁註,因爲我開始測試後臺任務,Springboard總是滾動一下左側,我可以看到我的應用程序在另一個頁面上的一些圖標。 o.O –

回答

0

使用+ sendSynchronousRequest結束

1

試試你的代碼遷移到:

- (空) applicationWillResignActive:(UIApplication *)應用程序

我相信讓它在applicationDidEnterBackground中已經太晚了。

檢查了文檔,你是對的,在applicationDidEnterBackground中應該沒問題。

另一個建議,請嘗試在dispatch_async塊內移動beginBackgroundTaskWithExpirationHandler。它可能必須在同一個線程中啓動,但沒有看到在文檔中明確指出。 returningResponse:錯誤:

+0

蘋果文檔在appdidenterbackground中執行。無論如何,會嘗試你的建議。明天。現在要回家:) –

+0

試圖在dispatch_async中移動bbeginBackgroundTaskWithExpirationHandler,但那根本不起作用。結束使用+ sendSynchronousRequest:returningResponse:錯誤:因爲它無論如何與ui線程無關。 –

相關問題