【问题标题】:Objective-C Blocks and variable scopeObjective-C 块和变量范围
【发布时间】:2012-02-23 05:27:20
【问题描述】:

我想在我的块中设置NSData 对象的值。有人可以告诉我我在这里做错了什么吗?

// Data
__block NSData *data = nil;

[ZSURLConnection performRequestWithUrl:wsdlURL xmlString:xml completionHandler:^(NSData *response, NSError *error) {

    // Handle the error
    if (error) {
        NSLog(@"Error: %@", [error localizedDescription]);
    } else {
        data = response;
    }//end

}];//end block

if (data) {
    NSString *d = [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] autorelease];
    NSLog(@"DATA --- %@", d);
}

return data;

为什么我不能将响应分配给data,然后在我的块之外检索它?

【问题讨论】:

    标签: objective-c ios cocoa-touch objective-c-blocks


    【解决方案1】:

    因为块是异步运行的,你的方法的其余部分之后。要么重写你的调用代码来处理异步加载,要么找到一种同步执行块工作的方法。我不知道ZSURLConnection 是什么,但请检查它是否具有不在后台运行的“执行...”方法的版本。

    【讨论】:

    • 所以没有办法为这样的返回 NSData 对象的请求制作包装器?我总是需要使用委托人?
    • 如果你做一个包装器,你需要在后台线程上运行它,因为你不能阻塞主线程。在大多数情况下,效率较低且代码量相同。你想解决什么问题?
    【解决方案2】:

    performRequestWithUrl:xmlString:completionHandler: 不是同步方法。它设置一个异步请求,然后立即返回。方法的其余部分运行并返回。

    当请求完成时,它才会运行你的块,分配data,然后立即将其丢弃。

    如果这是一种同步方法,您的例程将阻塞等待昂贵的网络操作。如果这是在主线程上,您的整个应用程序都会挂起。 ZSURLConnection(和NSURLConnection)旨在避免这种情况。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-12
      • 1970-01-01
      • 1970-01-01
      • 2014-01-20
      • 1970-01-01
      相关资源
      最近更新 更多