2014-05-20 36 views
0

我試圖在進入後臺時使用AFNetworking 2.0下載一個小文件。無論出於何種原因,NSLog都不會出現在控制檯中。在applicationDidEnterBackground上使用AFNetworking 2.0發送GET請求

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; 
manager.responseSerializer = [AFJSONResponseSerializer serializer]; 
[manager GET:@"SOMEURLHIDDEN" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) { 
    NSLog(@"%@", responseObject); 
} failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
    NSLog(@"%@",error); 
}]; 
+0

也許它沒有被調用?獲得NSLog之前。也許你用空字符串成功完成了?添加一些格式:NSLog(@「response =%@」,responseObject); – danh

回答

3

這裏的東西,你應該考慮(從this StackOverflow question拍攝):

AFHTTPRequestOperationManager使用舊NSURLConnection使 不利於後臺下載。

AFURLSessionManager使用NSURLSession引擎蓋下,這樣做

話雖這麼說,如果由於某種原因,你堅持使用AFHTTPRequestOperationManager繼續閱讀。

如果您試圖在applicationDidEnterBackground:或類似的代碼中運行此代碼,那麼爲什麼您在控制檯中沒有看到任何內容是可以理解的。當應用程序進入後臺時,可以隨時通過操作系統將其置於暫停狀態,這可能是您的情況正在發生的情況(請閱讀有關App States的更多信息)。如果您需要更多的時間來運行代碼,那麼你必須明確地要求它通過調用:

__block UIBackgroundTaskIdentifier backgroundTaskIdentifier = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{} 

這應該只是你想在後臺運行的代碼之前。

一旦您的應用程序耗盡時間並且將被暫停,就會調用到期處理程序。

[application endBackgroundTask:backgroundTaskIdentifier] 

總而言之你的代碼應該是這個樣子:

它完成了不管你在做(在你的情況下,你應該取消GET請求,如果它尚未完成),並調用是非常重要的
- (void)applicationDidEnterBackground:(UIApplication *)application 
{ 
    __block AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; 
    __block UIBackgroundTaskIdentifier backgroundTaskIdentifier = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{ 
     [manager.operationQueue cancelAllOperations]; 
     [[UIApplication sharedApplication] endBackgroundTask:backgroundTaskIdentifier]; 
    }]; 
    manager.responseSerializer = [AFJSONResponseSerializer serializer]; 
    [manager GET:@"SOMEURLHIDDEN" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) { 
     NSLog(@"%@", responseObject); 
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
     NSLog(@"%@",error); 
    }]; 
} 
0

我在SDWebimage庫中找到。

#if TARGET_OS_IPHONE && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_4_0 
    if ([self shouldContinueWhenAppEntersBackground]) { 
     __weak __typeof__ (self) wself = self; 
     self.backgroundTaskId = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{ 
      __strong __typeof (wself) sself = wself; 

      if (sself) { 
       [sself cancel]; 

       [[UIApplication sharedApplication] endBackgroundTask:sself.backgroundTaskId]; 
       sself.backgroundTaskId = UIBackgroundTaskInvalid; 
      } 
     }]; 
    } 
#endif 
相關問題