在后台线程中完成方法后重新加载UITableView

时间:2019-02-06 14:38:54

标签: objective-c

我有一个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方法?

2 个答案:

答案 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.
}];

我在这里看到两个警告标志。

  1. 在主线程上创建的对象不应在后台更新。
  2. 不要在后台调用视图控制器方法。

最简单的方法是立即分派到主线程。

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];
    });
}];

还有许多其他方法可以处理主线程/后台线程的交互,但我将从此开始。