我无法将块中捕获的异步响应/错误对返回给调用者。这是代码:
- (NSData *)sendSynchronousRequest:(NSURLRequest *)request returningResponse:(NSURLResponse **)response error:(NSError **)error
{
__block NSData* b_data = nil;
__block NSURLResponse* b_response = nil;
__block NSError* b_error = nil;
dispatch_semaphore_t wait = dispatch_semaphore_create(0);
[self sendRequest:request completion:^(NSHTTPURLResponse* c_response, NSData* c_data, NSError* c_error) {
b_data = c_data;
b_response = c_response;
b_error = c_error;
dispatch_semaphore_signal(wait);
}];
dispatch_semaphore_wait(wait, DISPATCH_TIME_FOREVER);
response = &b_response; // ERROR: Assigning NSURLResponse *__strong * to NSURLResponse *__autoreleasing * changes retain/release properties of pointer
error = &b_error; // ERROR: Assigning NSError *__strong * to NSError *__autoreleasing * changes retain/release properties of pointer
return b_data;
}
基本上,我将异步请求转换为同步请求。我需要通过指向指针的方式将响应/错误对返回给调用者。但是,我遇到了ARC和块的一些问题。
我想将响应/错误复制出来并将其返回给调用者,而不更改方法签名(有一大堆遗留代码调用此方法 - 我试图小心翼翼地替换NSURLConnection与NSURLSession)。
有没有一种很好的方法可以提取结果并将它们返回给调用者?
答案 0 :(得分:3)
你的两个错误与块无关。这些行应该是:
if (response) {
*response = b_response;
}
if (error) {
*error = b_error;
}
如果调用者为参数传递if
,则需要进行nil
检查。尝试取消引用nil
指针会导致崩溃。
也没有必要将响应/错误对复制到本地__block变量。检查nil
后,您可以将它们直接写入参数。