【问题标题】:ProgressView not updating in iOSProgressView 未在 iOS 中更新
【发布时间】:2020-02-12 06:44:20
【问题描述】:

我知道这个问题在 StackOverflow 上被问过很多次,但我已经检查过了。我的问题是在从 api hit 得到响应后,我正在主线程上更新这样的进度条

dispatch_async(dispatch_get_main_queue(),^{

     for (int i = 0; i < 5000; i++) 
     {
        NSLog(@"%f",i);
        [progressView setProgress:i/5000 animated:YES];
     }
 });

从这种方式我的进步没有更新 但是当我设置静态数字时它正在工作

[progressView setProgress:0.7 animated:YES];

经过搜索,我发现浮点十进制数字存在问题。因为 i/5000 即使在 4999/5000 上也总是给出 0.000000。所以在谷歌搜索后我改变了

dispatch_async(dispatch_get_main_queue(),^{

     for (int i = 0; i < 5000; i++) 
     {
        float f = (float)i/5000;
        [progressView setProgress:f animated:YES];
     }
 });

现在它正在更新,但进度视图不会连续更新,它是从 0 到 1 的最后一次跟踪更新

【问题讨论】:

  • 嗨@yatendra 整个dispatch_async 代码在哪里?在函数中?
  • 我在dispatch_async中只写了这个循环代码

标签: ios objective-c swift progress-bar


【解决方案1】:

第一个问题你做对了,整数除法总是给你 0。

第二个问题是主线程上的 UI 更新 - 即使在那时也只是定期更新。现在你的代码也在主线程上运行,所以当你的代码执行时 UI 完全被阻塞了。它只会在您的代码结束后才有机会更新,因此您只会看到最终值实际被渲染。

【讨论】:

    【解决方案2】:

    @trapper 你是对的,谢谢你的帮助,但我在一分钟前得到了这个解决方案,没问题。 在这里,我发布我的答案以帮助其他人。

    这是一个线程问题。 进度的绘制被堆叠在主队列中,并且仅在某个点执行,在最后。

    所以解决方案是在用户线程中运行循环,并在需要绘制时调用主线程(这是强制性的)。 所以,改变更新进度如下

    dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void){
                    //Background Thread
                    for (int i = 0; i < 50000; i++) {
    
                         float f = (float)i/50000;;
    
                        dispatch_async(dispatch_get_main_queue(), ^(void){
    
                            //Run UI Updates
    
                            [self->progressView setProgress:f animated:YES];
    
                        });
                    }
                });
    

    【讨论】:

      猜你喜欢
      • 2021-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多