0

これら 2 つの URL が同時にデータを返さないことに気付きました。URLが同時に返されるようにする方法を知りたいです。このコードを GCD に変更するにはどうすればよいでしょうか。それはお勧めですか?コードでディスパッチ キューを作成しましたが、何もプロットされず、機能しません。GCDがなくても機能しますが、同時に戻りません。どんな助けでも大歓迎です!

-(void)httpRequest{

_weak ASIHTTPRequest *request1 = [ASIHTTPRequest requestWithURL:url1];
[request1 setCompletionBlock:^{
    NSString *responseString1 = [request1 responseString];
//dispatch_async(backgroundProcess1,^(void){
    [self plotOverlay1:responseString1];
 //});
}];
[request1 setFailedBlock:^{
    NSError *error=[request1 error];
    NSLog(@"Error: %@", error.localizedDescription);
}]; 

[request1 startAsynchronous];


_weak ASIHTTPRequest *request2 = [ASIHTTPRequest requestWithURL:url2];
[request2 setCompletionBlock:^{
    NSString *responseString2 = [request2 responseString];
 //dispatch_async(backgroundProcess2,^(void){
    [self plotOverlay2:responseString2];
  //});
}];
[request2 setFailedBlock:^{
    NSError *error=[request2 error];
    NSLog(@"Error: %@", error.localizedDescription);
}]; 

[request2 startAsynchronous];


}
4

1 に答える 1

1

2 つの独立した非同期要求が同時に返されることを保証する方法はありません。

1 つの解決策は、要求をチェーンすることです。つまり、最初の要求の完了ブロックで 2 番目の要求を開始し、2 番目の要求の完了ブロックで両方の要求を処理します。

両方のリクエストを並行して実行できるようにする別の方法は、クラスにプロパティを作成して、リクエストからの応答を保持することです。要求完了ハンドラーでは、適切なプロパティを応答文字列の値に設定してから、新しいメソッドを呼び出します。このメソッドは、両方のリクエストの responseString プロパティに値があるかどうかを確認し、値がある場合は処理を行い、ない場合は何もしません。このように、一方のリクエストが終了するたびに何も起こりませんが (どちらが先に終了しても問題ありません)、もう一方のリクエストも終了すると、(両方のリクエストに対して) 処理が行われます。

-(void)httpRequest
{
    _weak ASIHTTPRequest *request1 = [ASIHTTPRequest requestWithURL:url1];
    [request1 setCompletionBlock:^{
        self.responseString1 = [request1 responseString];
        [self checkIfBothRequestsComplete];
    }];
    [request1 startAsynchronous];

    _weak ASIHTTPRequest *request2 = [ASIHTTPRequest requestWithURL:url2];
    [request2 setCompletionBlock:^{
        self.responseString2 = [request2 responseString];
        [self checkIfBothRequestsComplete];
    }];
    [request2 startAsynchronous];
}

- (void)checkIfBothRequestsComplete
{
    if (self.responseString1 && self.responseString2) {
        [self plotOverlay1:self.responseString1];
        [self plotOverlay2:self.responseString2];
    }

}
于 2012-09-24T21:00:32.063 に答える