2011-12-03 8 views
0

私はhttp://snippets.aktagon.com/snippets/350-How-to-make-asynchronous-HTTP-requests-with-NSURLConnectionのコードを使用して、独自のクラス(クラスB)に入れているので、私は単純なクラスBを初期化していますクラスAのクラスBのgetメソッド([classname get:url])にURLを送信して、返されたときにサーバーの応答を取得します。NSUrlConnectionを使用して競合条件でビートを取得

問題は、私のメソッドが返されるまでにdidReceiveData:メソッドが完了していないという事実のため、競合状態に敗れてしまいます。

NSUrlConnectionを使用した開発者の例を見てきましたが、この問題を解決する必要がないように、応答が最終的に入ってからビューを更新しています。

ありがとうございました。

私はしなければならない数のために非同期の呼び出しを保つ必要がありますが、私は任意の提案に開いています。

編集(答えから移動)

私はチュートリアルのオフに基づいてGCDにコードを変更し、私はまだ競合状態によって敗北取得しています。ここに私が今使っているコードがあります: あなたの提案に基づいてGCSに変更しましたが、まだ競合状態に巻き込まれています。私はそれを変更したコードを以下に示します: NSString * responseStringClassA = [InitalizedInstanceOfClassA LogIn:@ "username" @ "password"];

//Log into the server 
    -(NSString *)logIn: (NSString *) username password:(NSString *) password 
    { 
    NSString* returnString; 
    dispatch_queue_t downloadQueue = dispatch_queue_create("Login", NULL); 
    dispatch_async(downloadQueue, ^{ 
    BOOL success = YES; 
    NSString *urlAsString =[NSString stringWithFormat:@""URL HERE]; 
    NSLog(@"url sent out: %@", urlAsString); 
    NSURL *url = [NSURL URLWithString:urlAsString]; 
    NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url]; 
    NSError *error = nil; 
    NSData *connectionData = [NSURLConnection sendSynchronousRequest:urlRequest returningResponse:nil error:&error]; 
    NSLog(@"Connection Data: %@", [[NSString alloc] initWithData:connectionData encoding:NSASCIIStringEncoding]); 
    [returnString isEqualToString:[NSString stringWithUTF8String:[connectionData bytes]]]; 
    if ([connectionData length] > 0 && error == nil) { 
     //success 
     success = YES; 
    } 
    else if([connectionData length] == 0 && error == nil){ 
     //nodata 
     success = YES; 
    } 
    else if(error != nil){ 
     //error .. 
     success = NO; 
    } 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     [returnString isEqualToString:[[NSString alloc] initWithData:connectionData encoding:NSASCIIStringEncoding] ]; 
    }); 
}); 
return returnString; 
}        
+2

あなたの質問は不明です。あなたは、「開発者の例... [更新]は、応答が最終的に入ったときに表示されることに注意してください。それがこの問題に対処する方法です。あなたの実際の質問は何ですか? –

+0

あなたのGCDのアプローチは同じ基本設計上の問題を抱えています。このダウンロードをバックグラウンドで実行する場合は、このlogIn:password:メソッドから直接結果を返すことはできません。このメソッドは、最後のブロックがメインキュー上で実行できるようになる前に確実に戻ります。また、なぜあなたはisEqualToStringを行っているのですか?最後に比較しますか? –

答えて

1

非同期リクエストの目的は、intialメソッドが処理を完了することなく直ちに返すことです。その後、作業が完了すると、通知を受け、結果にアクセスして使用することができます。

もちろん、非同期操作以外のものを探していることは明らかです。また、同期URLリクエストを使用することもできますが、別のスレッドから実行することもできます。これを達成する最善の方法は、GCD(グランドセントラルディスパッチ)を使用することです。

ユーザーインターフェイスをバックグラウンドスレッドから更新することはできません。代わりに、URLリクエストが完了して結果を表示する場合は、performSelectorOnMainThreadNSObjectの部分)に電話する必要があります。

+0

(あるいは、GCDが混在している限り、 'dispatch_get_main_queue()'にディスパッチしてください:)) –

+0

@JonathanGrynspan:良い点。 – Codo

関連する問題