我有以下代码,它连接到服务器(实际上是我现在自己的机器),下载一些数据,将其反序列化,并将其分配给全局变量。
UINavigationController *navController = (UINavigationController *)self.window.rootViewController;
MasterViewController *masterController = [navController.viewControllers objectAtIndex:0]; // masterController is a UITableViewController subclass
NSMutableArray *surveys = [[NSMutableArray alloc] init];
NSURL *url = [NSURL URLWithString:@"http://127.0.0.1:8000/testapp/survey-data"];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *rep, NSData *d, NSError *err) {
if(d) {
NSMutableArray *allSurveys = [NSJSONSerialization JSONObjectWithData:d options:NSJSONReadingMutableContainers | NSJSONReadingMutableLeaves error:nil];
for(NSMutableArray *item in allSurveys) {
NSString *title = [item objectAtIndex:[item count] - 1];
[item removeLastObject];
Survey *survey = [[Survey alloc] initWithArray:item title:title];
[surveys addObject:survey];
}
masterController.surveys = surveys;
NSLog(@"%@", [masterController.surveys description]);
}
}];
不幸的是,它不起作用。(NSLog()
在处理程序块内)按预期打印出所有数据。显然,连接正在工作。但是,视图不会更新,并且行都是空白的。发生这种情况是因为下载完成后块被调用吗?我怎样才能避免这种情况?
它似乎也可能是由于在块中设置变量引起的。不过,我查看了 Apple 的文档,看起来这应该不是问题,因为我通过对masterViewController
. 我错了吗?
我应该注意,我尝试将其重写为使用 a [NSURLConnection sendSynchronousRequest:returningResponse:error:
,效果很好。但是,如果网络速度慢或出现故障,同步请求可能是一个糟糕的主意,所以我真的需要让它异步工作。