ios - 未在异步调用的 block 中设置变量

标签 ios objective-c-blocks

我有以下代码,它连接到服务器(实际上,现在是我自己的机器),下载一些数据,反序列化,并将其分配给全局变量。

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()(在处理程序 block 内)按预期打印出所有数据。显然连接正常。然而, View 没有得到更新,并且行都是空白的。发生这种情况是因为下载完成后调用了该 block 吗?我怎样才能避免这种情况?

这似乎也可能是由于在 block 中设置了一个变量引起的。不过,我查看了 Apple 的文档,这似乎不成问题,因为我正在通过对 masterViewController 的引用来设置一个数组。我错了吗?

我应该注意到,我尝试重写它以使用 [NSURLConnection sendSynchronousRequest:returningResponse:error:,效果很好。但是,如果网络速度很慢或出现故障,同步请求可能是个糟糕的主意,所以我真的需要让它异步工作。

最佳答案

由于您的 View 在您获取数据之前加载,因此您需要在数据到达后对 TableView 调用 reloadData

为防止出现其他问题,请确保在主线程上执行此操作,因为 UIKit 类不是线程安全的。

关于ios - 未在异步调用的 block 中设置变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10779575/

相关文章:

swift - 如何在 swift 中执行 block 样式函数

ios - __ block 的弱和强变量行为

ios - 关于 ios 中的 block 的混淆

objective-c - Objective-c中的 "__block"关键字是如何使用的?

ios - 每当尝试将应用程序上传到 App Store 时获取 ITMS-4238 “Redundant Binary Upload”

ios - 核心数据。如何交换 NSPersistentStores 并通知 NSFetchedResultsController?

ios - 保存 UIViewSubclass 的 Y 位置没有成员命名错误

c++ - Objective-C block 字面量语法原理

ios - 数据库错误 : database disk image is malformed

ios - 可以在 Objective-C 中保存种子 PRNG 吗?