Objective-C模块和可变范围

Objective-C模块和可变范围,objective-c,ios,cocoa-touch,objective-c-blocks,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(@"Erro

我想在我的块中设置
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;

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

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

当请求完成时,它才运行您的块,分配
数据
,然后立即将其丢弃


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

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

因此,没有办法为这样一个返回
NSData
对象的请求制作包装器?我将始终必须使用委托?如果制作包装,则需要在后台线程上运行它,因为无法阻止主线程。在大多数情况下,这种方法效率较低,代码也同样多。你想解决什么问题?