2011-11-13 96 views
0

我開發了一個連接到Twitter並獲取信息的小應用程序。我想在前端向用戶顯示這些信息。問題是,由於Twitter API使用線程,當我嘗試與GUI進行交互時,出現以下錯誤:iOS 5 Twitter API

嘗試從主線程或Web線程以外的線程獲取Web鎖。這可能是從輔助線程調用UIKit的結果。

我的問題是我如何知道在主線程中收到了Twitter的回覆,以便我能夠將其顯示給用戶?

的代碼是這樣的,它是在一個函數:

NSString * url = [[NSString alloc] initWithFormat:@"http://search.twitter.com/search.json?q=%@", query]; 

TWRequest * request = [[TWRequest alloc] initWithURL:[NSURL URLWithString:url] parameters:nil 
    requestMethod:TWRequestMethodGET];  

[request performRequestWithHandler:^(NSData * responseData, NSHTTPURLResponse * urlResponse, NSError * error) 
{ 
    if ([urlResponse statusCode] == 200) 
    { 
     // format response and show to user 
     // show to user 
    } 
    else 
    { 
     NSLog(@"Twitter error, HTTP response: %i", [urlResponse statusCode]); 

    } 
}]; 

如果我嘗試從這個函數修改GUI,我得到了一個錯誤。

謝謝

回答

4

決不允許從後臺線程進行UI更改。在這種情況下,您應該在TWRequest響應塊中使用[self performSelectorOnMainThread:withObject:waitUntilDone:]進行調用。見下面

例...

- (void)makeRequest { 

    NSString * url = [[NSString alloc] initWithFormat:@"http://search.twitter.com/search.json?q=%@", query]; 

    TWRequest * request = [[TWRequest alloc] initWithURL:[NSURL URLWithString:url] parameters:nil 
requestMethod:TWRequestMethodGET];  

     // make the request.. 
    [request performRequestWithHandler:^(NSData * responseData, NSHTTPURLResponse * urlResponse, NSError * error) 
      { 
       if ([urlResponse statusCode] == 200) 
       { 
        [self performSelectorOnMainThread:@selector(updateUI) withObject:nil waitUntilDone:NO] 
       } 
       else 
       { 
        NSLog(@"Twitter error, HTTP response: %i", [urlResponse statusCode]); 

       } 
      }]; 
    } 

    - (void)updateUI { 
      // here you can now update your UI safely 
    } 
+0

奈斯利解釋.... – viral