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