.h
@property (strong) NSString *reply;
私は次の方法を持っています:
.m
@synthesize reply;
- (void)send
{
[NSURLConnection sendAsynchronousRequest:[self request]
queue:[[NSOperationQueue alloc] init]
completionHandler:
^(NSURLResponse *response, NSData *data, NSError *error)
{
if (error)
{
//NSLog(@"Error,%@", [error localizedDescription]);
[self setReply: [[NSString alloc] initWithString:[error localizedDescription]]];
}
else
{
//NSLog(@"%@", [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding]);
[self setReply: [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding]];
}
}];
}
今、ブロック/ハンドラーから値を返そうとしましたが、明らかにこれは不可能です (または、まだ構文を理解していません)。
応答 (データ) の値を取得するためにローカル変数を設定しようとしましたが、エラーが発生します。
エラーが発生しない唯一の方法は、クラス プロパティを使用することです。しかし、[自己返信] の値を読み込もうとすると null であり、決して設定されていないと思います。
sendAsync 関数がスレッド化され、非同期であることを理解しています。[self reply] の値が null である理由は、sendSynchronousRequest を使用すると、常に応答が得られることです。
私は何を間違っていますか、どうすれば completionHandler 内から値を返すことができますか???
編集#1:私は何か非常に間違ったことをしているように見えます。コードをトレースしていて、同期送信を使用すると、すべて正常に機能しました。非同期のものを使用すると、 sendAsynchronousRequest への実際の呼び出しが実行されなかったため、スレッドが呼び出されていないため、値が空のと思われました。
編集#2:次を追加することで、これを回避する方法を見つけました:
[NSURLConnection sendAsynchronousRequest:[self request]
queue:[NSOperationQueue alloc] init
completionHandler:
^(NSURLResponse *response, NSData *data, NSError *error)
{
if (error)
{
//NSLog(@"Error,%@", [error localizedDescription]);
[self setReply: [[NSString alloc] initWithString:[error localizedDescription]]];
}
else
{
//NSLog(@"%@", [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding]);
[self setReply: [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding]];
}
}];
[[NSRunLoop currentRunLoop] runUntilDate: [NSDate dateWithTimeIntervalSinceNow: 2]];
ただし、それがどのように機能するかを完全に理解しているわけではありません。RunLoop が非同期操作を 2 秒間実行するように指示していると思います (日付間隔を低い値に設定すると、ライブ サーバーでのテストにより null 応答が返されるため、確認できます)。私が理解していないのは、RunLoop に実行を指示しただけで、現在のスレッドが終了していないかのように、すべてを永久にブロックし続けることです。