NSURLConnection の sendAsynchronousRequest メソッドを適切に使用しようとしていますが、ブロック パラメータに問題があります。呼び出しの上にブロックを作成し、__block 変数を使用して、ブロック内で収集されたデータを取得しようとしています。ブロック内のデータが正しいことを確認したので、ブロックは問題なく動作しており、ブロック データの取得は問題を残しています。メソッドの最後の割り当てと return ステートメントに正しい値が渡されていません。これは、割り当てが行われる前にブロックの実行がまだ完了していないためだと思います。メインスレッドを中断せずに割り当てを実行する前に、ブロックの実行が完了するまで「待機」するにはどうすればよいですか?
- (NSData *) sendAsynchronousURLRequest: (NSMutableURLRequest *)request withResponse: (NSURLResponse *)response andError:(NSError *)error
{
// Prepare the block handler.
__block NSURLResponse *retrievedBlockResponse;
__block NSError *retrievedBlockError;
__block NSData *retrivedBlockData;
void(^requestHandler)(NSURLResponse*, NSData*, NSError*) =
^(NSURLResponse *blockResponse, NSData *blockData, NSError *blockError)
{
retrievedBlockResponse = blockResponse;
retrivedBlockData = blockData;
retrievedBlockError = blockError;
// NOTE: Correct data is here...
NSLog(@"Data Inside Block:\n%@", [NSMutableDictionary DictionaryFromJSONData:blockData errorReport:nil]);
};
// Send the asynchronous request (operationQueue initialized elsewhere in class).
[NSURLConnection sendAsynchronousRequest:request queue:operationQueue completionHandler:requestHandler];
// NOTE: Reference to data cannot be established here!
// Establish references to block variables and return NSData object.
response = retrievedBlockResponse;
error = retrievedBlockError;
return retrivedBlockData;
}