我从另一个回答中得到了这段代码:
NSURLSession *aSession = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
[[aSession dataTaskWithURL:[NSURL URLWithString:@"http://www.ecb.int/stats/eurofxref/eurofxref-daily.xml"] completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if (((NSHTTPURLResponse *)response).statusCode == 200) {
if (data) {
NSString *contentOfURL = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"%@", contentOfURL);
}
}
}] resume];
现在我想在括号外使用字符串“contentOfURL”,而XCode不允许我使用它...为什么?当我想要这样做时:
NSURLSession *aSession = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
[[aSession dataTaskWithURL:[NSURL URLWithString:@"http://www.ecb.int/stats/eurofxref/eurofxref-daily.xml"] completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if (((NSHTTPURLResponse *)response).statusCode == 200) {
if (data) {
NSString *contentOfURL = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"%@", contentOfURL);
}
}
}] resume];
NSLog(@"%@", contentOfURL); //than here it shows me an error...
我的问题是,如何在括号外使用字符串“contentOfURL”... 谢谢你的问题
答案 0 :(得分:2)
你不能这样做,如果你设法解决语法问题就行不通。
首先是语法问题。变量声明是作用域的。它们仅在直接封闭的上下文中有意义。如果它们位于复合语句({
... }
)内,则该变量仅从其声明点开始定义,直到复合语句结束(结束}
)。如果它们位于文件范围内(在任何方法或函数之外),则它们从声明点到文件底部有效。
现在,概念问题:
您要求NSURLSession
通过调用NSURLSessionDataTask
来创建-dataTaskWithURL:completionHandler:
。 NSURLSessionDataTask
是一项长期运行的任务,它是异步。您正在传递一个“块”作为完成处理程序。该块是封装的代码和数据块。这是一个对象。它的副本由新NSURLSessionDataTask
保存,在数据任务完成之前不会被调用。
因此,contentOfURL
在您在代码段末尾添加的NSLog()
语句很久之后就没有任何价值。
您已经要求开始长时间运行的任务。它是异步的,这意味着您的代码无需等待即可完成。然后,您尝试在下一个语句中访问结果。但是还没有结果。这项长期任务几乎没有开始,更不用说完成了。
你需要真正调整思路,以包围异步代码。如果要对异步任务的最终结果执行某些操作,则需要在完成处理程序中放置“执行某些操作”代码,或者(对于以这种方式工作的API)将一些观察者代码用于监视任务具有的通知完成。
您不能编写仅假定下一个语句完成一个语句启动的任务的代码。 (第一个语句已完成,但启动的任务该语句没有。)
答案 1 :(得分:0)
您需要在括号外定义contentsOfURL
,如下所示:
NSString *contentOfURL;
NSURLSession *aSession = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
[[aSession dataTaskWithURL:[NSURL URLWithString:@"http://www.ecb.int/stats/eurofxref/eurofxref-daily.xml"] completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if (((NSHTTPURLResponse *)response).statusCode == 200) {
if (data) {
contentOfURL = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"%@", contentOfURL);
}
}
}] resume];
NSLog(@"%@", contentOfURL);
如果在块内定义contentsOfURL
,则变量的范围将保留在块内;因此,您需要在函数外声明变量。