.h
@property (strong) NSString *reply;
私は次の方法があります:私はまだ構文を考え出したていないNSURL Connection sendAsynchronousRequestレスポンスを保存するには?
.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]];
}
}];
}
は今、私がブロック/ハンドラから値を返すようにしようとしたが、どうやらこれが不可能である(またはを)。
ローカル変数を設定して返信(データ)の値を取得しようとしましたが、エラーが発生しました。
エラーが生成されなかった唯一の方法は、クラスプロパティを使用することです。しかし、[自己回答]の価値を読み取ろうとすると、それはヌルです。決して決してないと私は思うのです。
私はsendAsync関数がスレッド化され、非同期であることを理解しています。なぜなら、sendSynchronousRequestを使用すると、私はいつも返事を受け取るのですが、[self reply]の値はnullです。
私は間違っていますが、どのようにして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秒間実行するように指示していると想像しています(私は、日付間隔を低い値に設定すると、ライブサーバーでのテストのためにヌル応答を取得するためです)。私が理解していないことは、RunLoopに実行を指示すると、あたかも現在のスレッドが終了しなかったかのように、すべてを永久にブロックし続けることです。
私はこの問題/質問を理解していません。なぜブロック補完関数から値を返すことができないのですか? setReply関数は何をしますか?コードを表示 – Lefteris
データが有効かNullかを確認するためにブレークポイントを設定します。 あなたは正しい軌道に乗っていますが、これは有効なようですが、使用できる情報が得られていない可能性があります。 –
ブロックはvoid戻り値の型として指定されているため、ブロック自体は値を返すことができませんが、なぜ値を返す必要がありますか?私はあなたのsetReply関数を単に推測しているだけで、単にインスタンス変数の設定者ですか?この場合、ブロックから何も返す必要はありません。なぜなら、レスポンスはsetReplyのときにキャプチャされるからです。ローカル変数を使用してデータの値を取得するときに生成されるエラーは何ですか?あなたは、データを見るためにブレークポイントを設定することができます。また、あなたが受け取っているレスポンスコードをチェックします。 – tronbabylove