我有一个JSON解析器,负责获取我想在eval_hooks = []
eval_summary_hook = tf.train.SummarySaverHook(
save_steps=1,
output_dir='model_dir',
summary_op=tf.summary.histogram(logits.name, logits))
eval_hooks.append(eval_summary_hook)
return tf.estimator.EstimatorSpec(mode=mode,
loss=loss,
eval_metric_ops=eval_metric_ops,
evaluation_hooks=evaluation_hooks
)
中显示的数据。一切似乎都是正确的,除了,当后台的块获取数据时,我无法重新加载表视图。
这就是我现在的做法:
UITableView
我尝试在任务准备就绪时调用一个函数,并且还尝试在数组包含内容时重新加载表,但是不幸的是存在延迟,并且我无法从后台执行UI任务。
我的问题是,解决此问题的最佳解决方案是什么?是否可以从bg线程之外以某种方式通知reloadTable方法?
答案 0 :(得分:3)
您是否尝试过在主线程上调用它?
- (void) reloadTable {
dispatch_async(dispatch_get_main_queue(), ^{
[self.tableView reloadData];
});
}
答案 1 :(得分:1)
多线程控制器可能会变得复杂。这里有一些建议可以帮助您。
self.api = [API new]; // 1a: Created in the main thread.
[self.api requestWithCompletionHandler:^(NSArray<NSDictionary *> *result, NSError *error) {
for (NSDictionary* x in result) {
NSLog(@"The whole dict object: %@", [x objectForKey:@"datum"]);
[self.arr addObject:x]; // 1b: Updated in the background.
}
[self reloadTable]; // 2: Calling a view controller method in the background.
}];
我在这里看到两个警告标志。
最简单的方法是立即分派到主线程。
self.api = [API new];
[self.api requestWithCompletionHandler:^(NSArray<NSDictionary *> *result, NSError *error) {
dispatch_async(dispatch_get_main_queue(), ^{
for (NSDictionary* x in result) {
NSLog(@"The whole dict object: %@", [x objectForKey:@"datum"]);
[self.arr addObject:x];
}
[self reloadTable];
});
}];
还有许多其他方法可以处理主线程/后台线程的交互,但我将从此开始。