如何在括号内使用字符串

时间:2015-02-27 21:07:23

标签: ios objective-c

我从另一个回答中得到了这段代码:

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”... 谢谢你的问题

2 个答案:

答案 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,则变量的范围将保留在块内;因此,您需要在函数外声明变量。