2012-01-12 5 views
2

私は毎回20の結果を返すWebサービスを持っています(それはサービスプロバイダの制限です)。私はこのサービスを10〜20回繰り返して呼び出し、毎回UIを更新したいと思っています。 この状況にはベストプラクティスがありますか?私はサーバーを呼び出している間、UIをブロックしたくありません。これにより、進行中の操作中にユーザーがアクションを実行したい場合に問題が発生します (現在のページからナビゲートするようなもの) ありがとうございます!Webサービスを繰り返し、目的のc

+0

あなたは、Webサービスの通信が完了するのを待っている間にUIをブロックしたくないという点では間違いありません。私はどのようにWebサービス(NSURLConnection?)とやりとりしているのか分かりませんが、非同期的なやり方が必要です。同期メソッドしかない場合は、Grand Central Dispatchを調べることをお勧めします。 –

答えて

4

バックグラウンドスレッドでWebサービスを呼び出し、必要なデータを収集してメインスレッドに戻り、UIを更新することができます。

バックグラウンドプロセスでUIを更新することは推奨されていないため、上記(バックグラウンドスレッドからメインスレッドへのジャンプ)を行っています。

あなたが変更することができます [self performSelectorOnMainThread:@selector(myMainFunction) withObject:nil waitUntilDone:YES];

..

[self performSelectorInBackground:@selector(MyWebService) withObject:nil];//you can pass any object if you have

を使用して、バックグラウンドでのWebServiceあなたを呼び出すことができますし、バックグラウンドタスクは、あなたがすることができる上にあるときにメインスレッドに戻ってきて最後のパラメータはwaitUntilDone:Noです。これにより、ユーザーはUIが更新されるまで待つ必要はありません。彼らはそこにタスクを運ぶことができます。

NSTimerを使用して定期的にwebServiceを呼び出すことができます。

希望に応じて:

+0

お返事ありがとうございます。私はASIHTTPRequestを使用してサーバーへの同期呼び出しを使用しています。私の問題は、応答を同期させ、ユーザーが何か他のことをやっているときにページから離れるようなことを止めることです... –

+0

あなたはそのユーザーがそのUIにいるかどうかを知らせるブール値を入れることができます。彼は別のビューに移動することができます。あなたはboolをyesに設定できます。反復では、そのブールがイエスならばその反復を破るという条件を設定します。 –

+0

これはまさに私がやったことです。しかし、ユーザーが新しい検索を行い、最後の検索結果が途中で残っている場合はどうなりますか?私は混合結果を得る! (途中でリクエストを止めることはできません...) –

0

どのように情報を表示するかによって異なります。

あなたは非同期接続(バックグラウンドで同期接続を呼び出すよりも私の意見では、より効果的)とそのデリゲートを使用している場合、それはユーザーインターフェイスをブロックしないでください。

- (void)loadData { 
    NSString *urlString = @"http://www.stackoverflow.com"; 
    NSURL *url = [NSURL URLWithString:urlString]; 
    NSURLRequest *request = [NSURLRequest requestWithURL:url]; 
    [NSURLConnection connectionWithRequest:request delegate:self]; 
} 

// delegate methods 
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { 
    // clear out or intialize instance data variable 
    [myData setLength:0]; 
} 


- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { 
    [myData appendData:data]; 
} 


- (void)connectionDidFinishLoading:(NSURLConnection *)connection { 
    // convert data to whatever it's supposed to be (for example, array) 
    NSString *dataString = [[NSString alloc] initWithData:myData encoding:NSUTF8StringEncoding]; 

    NSArray *dataArray = [parser parseStringToArray:dataString]; 

    [myArray addObjectsFromArray:dataArray]; 

    //update tableview either using reload data (instant) or using updates (for smooth animation) 
} 

することができますその後、 didFinishLoading:メソッドの最後にloadDataメソッドを呼び出してループします。

関連する問題