私は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;
}
あなたの質問は不明です。あなたは、「開発者の例... [更新]は、応答が最終的に入ったときに表示されることに注意してください。それがこの問題に対処する方法です。あなたの実際の質問は何ですか? –
あなたのGCDのアプローチは同じ基本設計上の問題を抱えています。このダウンロードをバックグラウンドで実行する場合は、このlogIn:password:メソッドから直接結果を返すことはできません。このメソッドは、最後のブロックがメインキュー上で実行できるようになる前に確実に戻ります。また、なぜあなたはisEqualToStringを行っているのですか?最後に比較しますか? –