0

我正在尝试在开始下载数据之前更新屏幕上的 textView。现在,它只会在所有下载完成后更新视图。我怎样才能在下载之前或之间进行呢?

编辑:我想self.textView.text = @"Connection is good, start syncing...";在下载开始之前更新 UI。但现在,它只在下载完成后更新。

这是代码的样子。

if ([self.webApp oAuthTokenIsValid:&error responseError:&responseError]) {
    self.textView.text = @"Connection is good, start syncing...";
    [self.textView setNeedsDisplay];

    [self performSelectorInBackground:@selector(downloadCustomers:) withObject:error];
}

我是新手,还没有了解线程是如何工作的,但从我读到的内容来看,downloadCustomers 函数应该使用后台线程离开主线程来更新 UI。

4

2 回答 2

1

这里的模式是在后台线程上初始化你的下载,然后回调到主线程进行 UI 更新。

下面是一个使用GCD的例子。GCD版本的优点是您可以考虑使用您在 中所做的任何事情-downloadCustomers,在您调用它的地方插入内联。

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
   [self downloadCustomers];
      dispatch_async(dispatch_get_main_queue(), ^{
         [self.textView setNeedsDisplay];
      });
});
于 2013-04-08T07:55:14.040 回答
1
if ([self.webApp oAuthTokenIsValid:&error responseError:&responseError]) {
    self.textView.text = @"Connection is good, start syncing...";
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
      [self downloadCustomers];
      dispatch_async(dispatch_get_main_queue(), ^{
        //Do whatever you want when your download is finished, maybe self.textView.text = @"syncing finished"
      });
});
}
于 2013-04-08T10:55:17.090 回答