【问题标题】:How do I return variables captured from a block to the caller in Objective-C如何将从块中捕获的变量返回给Objective-C中的调用者
【发布时间】:2016-05-11 17:37:34
【问题描述】:

我在将块中捕获的异步响应/错误对返回给调用者时遇到问题。代码如下:

- (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 )。

有没有一种很好的方法可以提取结果并将它们返回给调用者?

【问题讨论】:

  • 哇。这是一个超级尴尬的指针错误。我正在覆盖参数而不是取消引用它并写入结果。我将把它留在这里作为不应该做的一个例子。

标签: objective-c objective-c-blocks


【解决方案1】:

您的两个错误与该块无关。这些行应该是:

if (response) {
    *response = b_response;
}
if (error) {
    *error = b_error;
}

如果调用者为参数传递nil,则需要if 检查。尝试取消引用 nil 指针时会发生崩溃。

也没有必要将响应/错误对复制到本地 __block 变量中。您可以在检查nil 后将它们直接写入参数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多