2014-04-20 55 views
0

我有一個NSURLConnection執行任務爲我上傳圖像。這就是我如何初始化和啓動這方面:NSRunLoop問題與NSURLConnection和鍵盤輸入

_connection = [[NSURLConnection alloc] 
       initWithRequest:request 
         delegate:self 
       startImmediately:NO]; 

[_connection scheduleInRunLoop:[NSRunLoop mainRunLoop] 
         orMode:NSDefaultRunLoopMode]; 
[_connection start]; 

其實我從別的地方自行dispatch_queue調用此方法dispatch_async。 問題是當圖像上傳時,我開始在鍵盤上輸入我的應用程序,有時會凍結應用程序。 經過一番挖掘,我開始明白mainRunLoop實際上是處理輸入請求的東西,例如鍵盤按鈕按下。我想知道我是否正確,這實際上是導致我的問題,這是凍結我的應用程序。 有關這個問題的任何幫助,非常感謝。 預先感謝您。

P.S:我試着在currentRunLoop上運行我的連接,但它不起作用,除非我手動啓動currentRunLoop。

+1

考慮使用'NSRunLoopCommonModes'而不是'NSDefaultRunLoopMode',它將確保它在UI延長的相關活動(例如滾動滾動視圖)時仍然被調用。 – Rob

+0

順便說一句,如果您從後臺隊列開始請求,則只需要上述代碼。否則,只要執行'initWithRequest:delegate:'。我認爲你的問題不在於上面的代碼。這個問題與你的問題有關嗎?(這是一個崩潰,而不是凍結)?當你說「凍結」你說你的UI凍結,或者只是說你的網絡活動停止? – Rob

回答

0

異步NSURLConnection是爲了在runloop中運行。所以你有兩個選擇:使用主線程/主循環或產生另一個線程,並在那裏啓動一個單獨的runloop。在後面的例子中,您需要使用[NSRunLoop currentRunLoop]而不是[NSRunLoop mainRunLoop]

我建議去主線程/主runloop。異步NSURLConnection非常高效,在主線程中運行它們很多都沒有問題。除非您在代理方法中執行非常昂貴的任務,否則您不會注意到任何性能問題。

所以只需在主線程上運行你的代碼,一切都應該沒問題。