Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 未在异步调用的块中设置变量_Ios_Objective C Blocks - Fatal编程技术网

Ios 未在异步调用的块中设置变量

Ios 未在异步调用的块中设置变量,ios,objective-c-blocks,Ios,Objective C Blocks,我有以下代码,它连接到服务器(实际上,现在是我自己的机器),下载一些数据,取消序列化,并将其分配给一个全局变量 UINavigationController *navController = (UINavigationController *)self.window.rootViewController; MasterViewController *masterController = [navController.viewControllers objectAtIndex:0]; // mas

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

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()
(在处理程序块内)按预期打印出所有数据。显然,这种联系正在发挥作用。但是,该视图不会更新,并且所有行都为空。发生这种情况是因为在下载完成后调用了块吗?我怎样才能避免这种情况

这似乎也可能是由于在块中设置了一个变量引起的。不过,我查阅了苹果的文档,似乎这不应该是个问题,因为我正在通过对
masterViewController
的引用来设置数组。我错了吗


我应该注意的是,我试图重写它以使用
[NSURLConnection sendSynchronousRequest:returningResponse:error:
,这很好。但是,如果网络速度慢或速度慢,同步请求可能是一个糟糕的主意,因此我确实需要让它异步工作。

AsynchronousRequest
在UI更新发生的地方不使用主线程,因此对于UI更新我们来说e这是:

dispatch_async(dispatch_get_main_queue(), ^{ 
    //UI update here    
});

由于视图在获取数据之前加载,因此需要在数据到达后在表视图上调用
reloadData


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

masterController是tableView吗?如果是,您可能应该在完成此操作后对其调用reloadData。我不确定是否是我编写了错误的代码(很有可能)但上次我对SeaDistaRoIP请求有不好的体验。请查看与Neull请求一起使用AdvyAcess下载的官方文档。这里还有其他同步问题。如果您的视图在编写新数据的过程中开始处理调查,会发生什么?谢谢你提醒我其他的同步问题。