2014-05-06 18 views
3

首先,裸露在我身邊,因爲這是我的第一個iOS相關問題。在dispatch_async中調用NSURLConnection,並在iPhone開發中讀取mainRunLoop中的didReceiveResponse

我所試圖做的是調用這個

NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 
[conn scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode]; 
[conn start]; 

dispatch_async(); 

後得到的響應爲以下方法

- (void) connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { } 

connection方法不調用。但是當我在dispatch_async之外運行NSURLConnection代碼時,它會調用該方法。

這是什麼原因,我該如何糾正它? 是因爲delegate是指selfself是指後臺線程而不是UIViewController類本身?

+0

當你調用'dispatch_async'時你想要調用什麼線程? – Levi

+0

哪個調度隊列在'dispatch_async()'中使用? –

+0

當我調用'NSURLConnection'時,我在'dispatch_async()'裏面。順便通過調用'[self performSelectorOnMainThread:@selector(myBgWork)withObject:Nil waitUntilDone:NO];'this並且將'NSURLConnection'代碼放在'myBgWork'裏面給了我'didReceiveResponse'的響應。但是現在我很困惑,因爲我覺得我的後臺工作再次調用主線程,它會減慢我的應用程序。是這樣嗎? – AnujAroshA

回答

0

由於您正在創建一個要在循環中調度的連接並稍後啓動,因此請務必使用initWithRequest的呈現,startImmediately參數設置爲NO。現在,你開始連接兩次。而且,更重要的是,您在將它安排在主運行循環中之前就開始了它。

爲了解決這個問題,指定startImmediatelyNO

NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:NO]; 
[conn scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode]; 
[conn start]; 

話雖如此,我認爲沒有必要在所有調度此代碼到後臺隊列(因爲initWithRequest異步運行,並沒有對應用性能有明顯的影響)。我使用上述模式的唯一時間是當我在自定義NSOperation子類中包裝我的NSURLConnection請求時(在這種情況下,上述模式非常有用)。但在這種情況下,這是不必要的。

+0

謝謝你的迴應。我使用'dispatch_async()',因爲我有一個文件壓縮過程,這將需要相當長的時間。 – AnujAroshA

+0

@AnujAroshA然後,你可以將這個壓縮過程調度到後臺隊列。但是將連接的開始調度到後臺隊列是沒有意義的,特別是如果你打算在主運行循環中調度和調度它(這意味着所有的委託方法都在主線程上調用,儘管你從後臺隊列實例化連接)。即使它沒有在主線程中運行,也沒有理由不這樣做。只需將緩慢的壓縮代碼發送到後臺隊列即可。 – Rob

相關問題