다음은 저에게 적합한 완벽한 구현입니다. 이름을 변경하고 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];
}
편집 나는 방법 때문에 수정했다 완성 블록에서 UIKit 호출을 만들고있었습니다 (예 : 레이블 등 업데이트). 따라서 실제로는 주 스레드에서 완료 블록을 호출하는 것이 더 안전합니다. (원래 버전이 주석 처리 됨)
1 단계 : 합리적으로 짧은 제목을 사용하고 코드의 형식을 지정하십시오. –