2013-03-31 38 views
0

所以,我試圖連接到遠程服務器來獲取和顯示數據。在viewDidLoad我使用NSThread呼叫被叫doSomethingNSThread無法加載選擇器方法

- (void)doSomething 
{   
    @autoreleasepool 
    {     
     NSMutableURLRequest *httpRequest = [NSMutableURLRequest requestWithURL:someURL]; 
     [httpRequest setHTTPMethod:@"POST"]; 
     [httpRequest setValue:[NSString stringWithFormat:@"%d", httpRequestParametersClean.length] forHTTPHeaderField:@"Content-Length"]; 
     [httpRequest setValue:@"application/x-www-form-urlencoded charset=utf-8" forHTTPHeaderField:@"Content-Type"]; 
     [httpRequest setHTTPBody:httpRequestParametersClean]; 

     (void)[[NSURLConnection alloc] initWithRequest:httpRequest delegate:self]; 

     for (NSString* key in response) 
     { 
      // loop through returned values 
     } 
    } 
} 
功能

viewDidLoad的代碼是

[NSThread detachNewThreadSelector:@selector(someURL) toTarget:self withObject:nil]; 

然後,我有一個REFRESH按鈕,當通過簡單地說[self doSomething]

點擊通話 doSomething以及

我的問題是,當視圖加載時,來自服務器的響應爲空。直到我點擊刷新按鈕,我仍然沒有迴應。奇怪!我究竟做錯了什麼?

+0

我可以看到,NSThread調用getTableViewCells而不是doSomething –

+0

這是一個錯字。即使當我確定該線程正在調用正確的函數時,問題依然存在 –

回答

3

一個NSURLConnectioninitWithRequest:delegate:創建工作異步,調用委託功能connection:didReceiveResponse:connection:didReceiveData:,......後來,當數據從服務器讀取。您的代碼甚至不會連接start,因此無論如何都不會發生任何事情。

解決您的問題,最簡單的方法是使用同步版本

sendSynchronousRequest:returningResponse:error: 
NSURLConnection

。如果doSomething在單獨的線程中執行,則不會阻止UI。請注意,您也可以使用基於代理的方法NSURLConnection。這些更加靈活(參見例如https://stackoverflow.com/a/15591636/1187415作爲比較)。另一個不錯的選擇是sendAsynchronousRequest:queue:completionHandler:,它會自動創建後臺線程。

+0

不(void)[[NSURLConnection alloc] initWithRequest:httpRequest delegate:self];開始連接? –

+0

'connectionWithRequest:delegate:'''initWithRequest:delegate:startImmediately:YES'立即啓動連接,但不是'initWithRequest:delegate:'。 –

+0

感謝您的信息 –