2017-04-26 156 views
0

我試圖更新舊的應用程序以從NSURLConnection移動到NSURLSession。一切工作正常,當我用塊NSURLSession:不調用NSURLSession委託方法

NSURLSessionDataTask *dataTask = [session 
              dataTaskWithRequest:request 
completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {} 

但有時我需要分析的數據應用從服務器接收,所以我需要didReceiveResponse和didReceiveData方法,類似於NSURLConnection的使用的那些。我試圖做這樣的:

NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; 

NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration 
                 delegate:self 
               delegateQueue:nil]; 
NSURLSessionDataTask *dataTask = [session dataTaskWithURL:[NSURL URLWithString:@"https://www.apple.com"]]; 
[dataTask resume]; 

但是我的代表從來不被稱爲:

- (void)URLSession:(NSURLSession *)session 
NSURLSessionTaskDelegatedidReceiveResponse:(NSURLResponse *)response 
completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler 
{ 
    NSLog(@"-----------------------> NSURLSessionTaskDelegatedidReceiveResponse"); 
    completionHandler(NSURLSessionResponseAllow); 
} 
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data 
{ 
    NSLog(@"----------------> didReceiveData"); 
} 
當我試圖使用其它類型的任務(NSURLSessionDownloadTask例如)

同樣的事情發生,他們的代表從未被召喚。我實際上可以在調試器中看到任務正在切換到運行狀態,但我永遠無法獲得對代表的任何調用。 在我的頭文件我做我的順應到的ViewController代表:

@interface ViewController : UIViewController <NSURLSessionDelegate, NSURLSessionDataDelegate, NSURLSessionTaskDelegate> 

我做了相當多的搜索,但即使我只要我努力嘗試從網絡,他們只是停止工作的一些工作實例將它們粘貼到我的項目中。例如this tutorial對我來說是完美的(我必須將傳輸安全權限添加到plist文件,但這就是它)。但是當我試圖在我的項目中使用這些代碼時,委託不會被調用。而當我實際上將我的代碼粘貼到另一個簡單的應用程序時,它工作得很好。所以我的項目設置可能有問題?你能告訴我什麼可能導致這樣的事情?我現在完全不知所措。

+0

你看到這一點:http://stackoverflow.com/questions/21200521/nsurlsession-delegate-methods-not-called ? – Koen

+0

不幸的是,我的問題與URL無關。我試圖使用一些不同的東西,最初我通過[session dataTaskWithRequest:request]使用之前用過NSURLConnection的URL; (它當然是用https://)。 – Evgeny

回答

3

您正在使用完成塊。這排除了委託電話。 https://developer.apple.com/reference/foundation/nsurlsessiondatadelegate?language=objc

完成處理程序塊主要意圖作爲使用自定義委託 的替代方案。如果使用 採用完成處理程序塊的方法創建任務,則不會調用響應 和數據傳遞的委派方法。

而且你要使用的方法有不同的名稱

- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler 
+0

是的,我使用塊,但它們用於應用程序中的其他NSURLSession實例。我在我的測試項目中爲NSURLSession的不同實例混合了一個塊和一個委託,它們的工作沒有任何問題。 感謝您的語法修正,當我準備網絡代碼時,我可能會搞砸了。 – Evgeny