2011-12-26 73 views
0

我試圖在後臺運行一個方法,但它仍然阻止程序。 這是我的代碼:Objective-C中的多線程

- (void)viewDidLoad 
    { 
     [super viewDidLoad]; 
     self.MessagesList=[[MessagesArray alloc] init]; 

     [self performSelectorInBackground:@selector(backgroundMethod) withObject:nil]; 
    } 


    -(void)backgroundMethod 
    { 
     if ([MessagesList updateFromServer]){ 
      [self.Table reloadData]; 
      CFRunLoopRun(); 
    } 
} 

雖然updateFromServer將HTTP請求發送到服務器,並等待響應時,服務器延遲以10秒的反應,其結果是,整個程序被延遲10秒太。你能糾正我嗎?

更新:我添加了一個runloop行,但問題依然存在。 HTTP請求是異步的,但仍然是 - 整個程序一直等到服務器響應。這是我的updateFromServer方法:

responseData = [NSMutableData data]; 
[self setBaseURL:[NSURL URLWithString:@"http://localhost:8000/messages/views/new_messages/"]]; 
NSURLRequest *request = 
    [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://localhost:8000/messages/views/new_messages/"]]; 
NSURLConnection* connection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 
return TRUE; 

我怎樣才能使它成爲異步的真實?

+0

如何使用NSThread來代替? – 2011-12-26 12:08:23

+0

我也試過了。沒有什麼變化。感謝 – 2011-12-26 12:28:40

回答

1

總是更新主線程上的UI,[self.Table reloadData]不會在後臺線程上更新。你如何發送HTTP請求? NSURLConnection異步或同步?

如果它是一個同步連接,那麼它會阻塞它正在運行的線程直到收到響應。

+0

當我運行一個同步請求時,它將它阻止。異步只是不運行(如果我從主線程調用它,它會運行,但if語句因爲它正在等待響應而阻塞)。 任何方式 - 如果我需要全天候檢查服務器更新,我如何從主線程更新UI? – 2011-12-26 09:14:35

+0

在後臺線程中,您可以在任何NSObject上調用 - [NSObject performSelectorOnMainThread:withObject:waitUntilDone:]。我在很多地方都做到了這一點,效果很好。 – 2011-12-26 09:42:36

+0

@AmitHagin,爲後臺線程異步NSURLConnection添加一個運行循環。 – 0x8badf00d 2011-12-26 09:46:18