2011-12-26 8 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秒遅れで表示されていることですあまりにも。私を訂正できますか?

更新:私はランループラインを追加しましたが、問題は変わりません。 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を使うのはどうですか? –

+0

私もそれを試しました。何も変わりません。ありがとう –

答えて

1

メインスレッドのUIを常に更新すると、[self.Table reloadData]はバックグラウンドスレッドで更新されません。どのようにHTTPリクエストを送信していますか? NSURLConnection非同期または同期ですか?

同期接続の場合は、応答を受信するまで実行中のスレッドをブロックします。

+0

私はそれをブロックする同期要求を実行します。非同期は単に実行されません(メインスレッドから呼び出すと実行されますが、応答を待っているためif文がブロックされます)。 何らかの方法 - サーバーからの常時チェックの更新が必要な場合、メインスレッドからUIを更新するにはどうすればよいですか? –

+0

バックグラウンドスレッドから、NSObjectの - [NSObject performSelectorOnMainThread:withObject:waitUntilDone:]を呼び出すことができます。私は多くの場所でこれを大きな効果をもたらしました。 –

+0

@AmitHagin、バックグラウンドスレッド非同期NSURLConnectionの実行ループを追加します。 – 0x8badf00d

関連する問題