0

NSURLRequestWeb サービスに接続し、2 つの異なるサービスを呼び出す 2つのオブジェクトがあります。

問題は、ランダムな結果があることです。最初の結果が最初に表示されることもあれば、2番目の結果が最初に表示されることもありNSURLRequestます。

NSString *urla=@"http://localhost:8080/stmanagement/management/retrieve_dataA/?match_link=";
NSString *uria = [urla stringByAppendingString:self.lien_match];
NSURL *urlla= [ NSURL URLWithString:uria];
NSURLRequest *requesta =[ NSURLRequest requestWithURL:urlla];

NSString *urlb=@"http://localhost:8080/stmanagement/management/retrieve_dataB/?match_link=";
NSString *urib = [urlb stringByAppendingString:self.lien_match];
NSURL *urllb= [ NSURL URLWithString:urib];
NSURLRequest *requestb =[ NSURLRequest requestWithURL:urllb];

connectiona=[NSURLConnection connectionWithRequest:requesta delegate:self];
connectionb=[NSURLConnection connectionWithRequest:requestb delegate:self];

if (connectiona){
    webDataa=[[NSMutableData alloc]init];
}

if (connectionb){
    webDatab=[[NSMutableData alloc]init];
}

私がしていることは正しいですか?2 つの の間に小さなブレークを追加する必要がありNSURLRequestますか?

ビューを実行するたびにランダムな結果が得られるためです。(結果を 2 つのUITableViewオブジェクトに設定しています)。

4

1 に答える 1

2

あなたの「問題」は、両方selfの接続の接続デリゲートであると思います。これらのタイプの接続は非同期であるため、A が B の前に完了するという保証はありません。コードは、Web サーバーがデータを返す順序を処理する必要があります。

2 つのメソッドを同期させることができると思います(A が完了するまで B を開始しないでください) が、実際にそれを行う必要はないと思います。

良いニュースは、NSURLConnectionDelegateコールバックがオブジェクトを渡すことですNSURLConnection。したがって、それを使用して、A または B への応答を取得しているかどうかを判断できます。その情報は、A または B Web データ オブジェクトにデータを配置するかどうかを示します。要求が完了したときに、テーブル ビュー A または B を更新するかどうか。例えば:

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    // determine which request/connection this is for
    if (connection == connectiona) {
        [webDataa appendData: data];
    } else if (connection == connectionb) {
        [webDatab appendData: data];
    }
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    // determine which request/connection this is for
    if (connection == connectiona) {
        NSLog(@"Succeeded! Received %d bytes of data",[webDataa length]); 
        // TODO(?): update the data source for UITableView (A) and call:
        [tableViewA reloadData];  
    } else if (connection == connectionb) {
        NSLog(@"Succeeded! Received %d bytes of data",[webDatab length]);   
        // TODO(?): update the data source for UITableView (B) and call:
        [tableViewB reloadData];  
    }

    // release the connection* and webData* objects if not using ARC,
    //  otherwise probably just set them to nil
}

このソリューションでは、投稿したコードのローカル変数ではなく、永続的なivarとして保持する必要がありますconnectiona。おそらくそうしているようですが、宣言を表示していないので、確認したかっただけです。connectionb

もちろん、他のデリゲート コールバックも実装する必要がありますが、上記の 2 つは一般的な解決策の良い例です。

于 2013-03-14T02:02:56.280 に答える