Objective-C块和可变范围

我想在我的块中设置一个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 ,然后在我的块之外进行检索?

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

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

请求完成后,才会运行您的块,它分配data ,然后立即将其扔掉。

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