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
)旨在避免这种情况。