2014-03-24 79 views
7

我最近一直在學習Objective C,並且我決定嘗試連接。NSURLSessionDataTask dataTaskWithURL完成處理程序沒有被調用

一切都很好,NSURLConnection,直到我發現它已經過時,並試圖與NSURLSession工作。

我正在嘗試一個非常簡單的示例,但似乎無法讓我的應用程序在完成塊內運行代碼。

下面是使用的代碼:

NSURL * url = [NSURL URLWithString:@"http://api.openweathermap.org/data/2.5/weather?q=London,uk"]; 

NSLog(@"2"); 
NSURLSessionConfiguration *defaultConfigObject = [NSURLSessionConfiguration defaultSessionConfiguration]; 
NSLog(@"3"); 

NSURLSession *defaultSession = [NSURLSession sessionWithConfiguration: defaultConfigObject 
                  delegate: nil 
                 delegateQueue: [NSOperationQueue mainQueue]]; 

NSLog(@"4"); 
NSURLSessionDataTask * dataTask = [defaultSession dataTaskWithURL:url 
               completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 
                dispatch_sync(dispatch_get_main_queue(), ^{ 
                 NSLog(@"11"); 
                 if(error == nil) 
                 { 
                  NSString * text = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding]; 
                  NSLog(@"Data = %@",text); 
                 } 
                 NSLog(@"22"); 
                }); 

               }]; 

NSLog(@"5"); 
[dataTask resume]; 
NSLog(@"6"); 

我從主執行打印的所有號碼,但從來沒有執行completionHandler。我也嘗試使用委託,沒有成功。

在此先感謝。

編輯 至於建議,我已經改變了我的功能如下:

-(void) doGET{ 
    NSURLSessionConfiguration *defaultConfigObject = [NSURLSessionConfiguration  defaultSessionConfiguration]; 
    NSURLSession *defaultSession = [NSURLSession sessionWithConfiguration: defaultConfigObject]; 
    NSURLSessionDataTask * dataTask = [defaultSession dataTaskWithURL:[self url] 
                completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 
                  NSLog(@"11"); 
                  if(error == nil) 
                  { 
                   NSString * text = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding]; 
                   NSLog(@"Data = %@",text); 
                  } 
                  NSLog(@"22"); 

                }]; 
    [dataTask resume]; 

} 

我完成經理仍然沒有得到運行。我也嘗試使用sharedSession,而不是傳遞配置,但沒有運氣。

感謝您的幫助

+0

你有沒有得到這段代碼的工作?我的代碼幾乎是相同的(我想我們訪問了相同的網站),我也無法獲得完成代碼塊被調用。但是,我使用iOS模擬器7.1作爲單元測試運行我的代碼,我想知道這是否會產生任何影響。我還修改了NSURLSession,沒有任何幫助。我注意到你把問題標記爲已回答,但仍不清楚答案是什麼? –

回答

5

如果你要使用的數據任務的完成移交塊,而不是指定的nil一個delegate,像這樣:

NSURLSession *defaultSession = [NSURLSession sessionWithConfiguration: defaultConfigObject 
                  delegate: nil 
                 delegateQueue: [NSOperationQueue mainQueue]]; 

而應該實例,

NSURLSession *defaultSession = [NSURLSession sessionWithConfiguration: defaultConfigObject]; 

,或者因爲你」:使用該方法您的會話不採取delegate在所有再沒有自定義配置的所有,你可以完全跳過NSURLSessionConfiguration的實例化和使用共享NSURLSession

NSURLSession *defaultSession = [NSURLSession sharedSession]; 

但是,底線,你不應該使用sessionWithConfiguration:delegate:queue:再現,除非你打算實施代表,在這種情況下,您將不會使用NSURLSessionDataTask方法與completionHandler參數的再現。

此外,請確保您的設備/模擬器運行的是iOS 7.0或更高版本。

+0

我試圖用各種不同的方法做到這一點:使用自定義委託,您給出的建議和我上面發佈的建議。問題是我沒有從完成處理程序(或使用它時的委託)中獲取NSLog操作。我的代碼有點混淆了我所採用的所有方法,所以它可能不是最好的,但我無法得到代理或完成處理程序來打印任何內容。我不確定爲什麼我讀過的所有內容都表明它應該。你知道是否有任何其他原因它不會'執行'完成hander嗎?在此先感謝 – ylc

+0

我已經編輯了與您的建議,但即使使用新功能我沒有反應completionHandler – ylc

+0

@ user3214816是你在iOS 7上運行這個?如果你在iOS 6.1上運行,你不會得到一個異常(我很驚訝),但'defaultSession'和'dataTask'一樣是'nil'。除此之外,我不知道爲什麼它不起作用,因爲您的代碼可以在我的iOS 7.x設備和iOS 7.x模擬器上正常工作。我建議記錄'defaultSession'和'dataTask',看看你是否得到有效的對象。 – Rob

0

檢查您的代碼的位置。

雖然它不是在OP 其中代碼位於說,我發現,經過多次尋找,並多次迭代,這將示例代碼中-viewDidLoad從來沒有執行完成處理。移動代碼到

- (void)viewWillAppear:(BOOL)animated { } 

解決從未完成任務的問題。 (我仍然不明白爲什麼。)

相關問題