Objective-C块和变量范围

时间:2012-02-23 05:27:20

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

我想在我的块中设置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然后在我的区块之外检索它?

2 个答案:

答案 0 :(得分:7)

因为块以异步方式运行,之后的其余方法。重写您的调用代码以使用异步加载,或者找到一种同步执行块工作的方法。我不知道ZSURLConnection是什么,但请检查它是否有一个不在后台运行的“perform ...”方法版本。

答案 1 :(得分:3)

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

请求完成后,才会运行您的块,该块会分配data,然后立即将其丢弃。

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