ここに私のために働く完全な実装があります。名前を自由に変更して のカテゴリとしてNSURLConnection
追加するか、作業中のクラスのローカル メソッドとして追加してください。
-(void)sendAsynchronousRequest:(NSURLRequest*)request queue:(NSOperationQueue*)queue completionHandler:(void(^)(NSURLResponse *response, NSData *data, NSError *error))handler
{
__block NSURLResponse *response = nil;
__block NSError *error = nil;
__block NSData *data = nil;
// Wrap up synchronous request within a block operation
NSBlockOperation *blockOperation = [NSBlockOperation blockOperationWithBlock:^{
data = [NSURLConnection sendSynchronousRequest:request
returningResponse:&response
error:&error];
}];
// Set completion block
// EDIT: Set completion block, perform on main thread for safety
blockOperation.completionBlock = ^{
// Perform completion on main queue
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
handler(response, data, error);
}];
};
// (or execute completion block on background thread)
// blockOperation.completionBlock = ^{ handler(response, data, error); };
// Execute operation
[queue addOperation:blockOperation];
}
EDIT
完了ブロックでUIKit呼び出しを行っていたため、メソッドを変更する必要がありました(ラベルの更新など)。したがって、実際には、メイン スレッドで完了ブロックを呼び出す方が少し安全です。(元のバージョンはコメントアウトされています)