2016-08-04 135 views
-3
NSURL *httpsURL = [NSURL URLWithString:@"https://example.com"]; 
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:httpsURL cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData timeoutInterval:5.0f]; 
self.connection = [NSURLConnection connectionWithRequest:request delegate:self]; 
[self.connection start]; 

while(something) { 
    // some code 
} 

在上面的代碼中,代表(例如:willSendRequestForAuthenticationChallenge)不執行,直到while循環就完成了。這種行爲的原因是什麼以及如何解決這個問題?我希望代表在後臺執行。我怎樣才能實現它?NSURLConnection的委託方法不執行

在此先感謝。

+0

請勿使用NSURLConnection。它已被棄用。 – matt

+0

不相關,但不要調用'start',因爲'connectionWithRequest:delegate:'自動啓動連接。你唯一一次調用'start'就是當你用'startImmediately'設置爲'false'來啓動連接的時候。但它沒有實際意義,因爲你應該使用'NSURLSession'。 – Rob

回答

1

NSURLConnection已棄用。使用NSURLSession。當你這樣做時,將會話的delegateQueue設置爲後臺隊列。這樣,您的委託消息就可以到達。現在,你阻止他們到達,因爲他們想要到達主線程而他們不能。

但是,正如dgatwood所說,如果你正在做一些耗時的事情,可能會阻塞主線程,那也是錯誤的。如果你嘗試這種事情,你的應用程序將被WatchDog程序殺死。

+0

讓運行循環只運行一次是不夠的。 NSURLConnection的所有回調都發生在連接開始的同一個線程上,所以如果你在同一個線程中做了很多工作,你會延遲連接的每個方面 - 不僅僅是建立連接,還要發送頭文件,處理初始響應(狀態碼和頭文件),讀取/累積響應數據,並告訴應用程序請求已完成。將所做的任何處理移動到單獨的線程中,以便根本不會阻塞主線程。 – dgatwood

+0

@dgatwood好點,完全修改了我的答案。 – matt

+0

我可以使用nsurlconnection,雖然它已被棄用,因爲這是針對企業分佈的。主要的問題是,一旦我得到響應,我應該返回調用函數(簡單地說,我想在處理aurhentication時執行同步請求),因爲此函數由javascript代碼調用,並且本地函數應返回響應背部。如果nsurlconnection無法實現,那麼我想用NSUrlSession。請給我一個方法來執行這個任務 –