ios - 为什么 View 即使在我的线程上也没有更新?

标签 ios objective-c objective-c-blocks

我试图了解为什么在设置某些值时 View 没有更新。问题看起来微不足道,但我花了很多时间来找到问题 - 没有结果。

  • 当返回 block 中的最后一个值时, View 将更新为此最后报告的进度值。
  • slider 上的设置值在主线程上 - 在 dispatch_async() 中执行更改后没有任何变化在主线程上。

  • 这是完整的代码:
    #import "ViewController.h"
    
    @interface ViewController ()
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
        [self performSelector:@selector(doUpdate) withObject:nil afterDelay:5.0f];
    }
    
    
    - (void)doUpdate {
        __weak typeof(self.slider) weakSlider = self.slider;
        [self doSomethingAndReportProgress:^(CGFloat progress) {
            NSLog(@"3. reported progress: %f", progress);
            weakSlider.value = progress; /// slider has range 0 - 100
            NSLog(@"4. weakSlider.value: %f", weakSlider.value);
        }];
    }
    
    - (void)doSomethingAndReportProgress:(void(^)(CGFloat))block {
        [self doSomethingOtherAndReportProgress:^(CGFloat progress) {
            block(progress);
            NSLog(@"2. reported progress: %f", progress);
        }];
    }
    
    - (void)doSomethingOtherAndReportProgress:(void(^)(CGFloat))block {
        for (int i = 0; i < 10000; i++) {
            CGFloat progress = i / 100.0;
            block(progress);
            NSLog(@"1. reported progress: %f", progress);
        }
    }
    
    @end
    

    来自控制台的日志报废:
    2014-04-23 09:48:03.991 UIUpdateInBlock[87087:60b] 3. reported progress: 2.050000
    2014-04-23 09:48:03.991 UIUpdateInBlock[87087:60b] 4. weakSlider.value: 2.050000
    2014-04-23 09:48:03.991 UIUpdateInBlock[87087:60b] 2. reported progress: 2.050000
    2014-04-23 09:48:03.992 UIUpdateInBlock[87087:60b] 1. reported progress: 2.050000
    ....
    2014-04-23 09:48:04.421 UIUpdateInBlock[87087:60b] 3. reported progress: 3.950000
    2014-04-23 09:48:04.422 UIUpdateInBlock[87087:60b] 4. weakSlider.value: 3.950000
    2014-04-23 09:48:04.423 UIUpdateInBlock[87087:60b] 2. reported progress: 3.950000
    2014-04-23 09:48:04.423 UIUpdateInBlock[87087:60b] 1. reported progress: 3.950000
    ....
    

    为什么日志的顺序是:3, 4, 2 ,1 而不是 1, 2, 3, 4?

    先感谢您。

    最佳答案

    因为你把你的NSLog调用后block() ,只要把它们放在前面,你就会得到正确的结果;)

    关于ios - 为什么 View 即使在我的线程上也没有更新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23238165/

    相关文章:

    javascript - 我们如何处理 TVML 的逻辑以及它可以与 UIKit 一起使用吗?

    objective-c - 通过 Interface Builder 在自定义对象上设置属性

    ios - UITableViewCell 中 UIImageView 上的 UISwipeGesture

    ios - dispatch_async 是否复制内部 block

    ios - 在 iMessage 扩展中发送图像

    python - 我设置了 https,但数据仍然响应没有证书的客户端

    ios - 苹果商店接受,提交一个应用程序,该应用程序以盈利为目的使用其他服务

    ios - iOS 8后台获取从未在设备上多次调用

    ios - 是否可以从 iOS 中的另一个函数调用 block 完成处理程序?

    ios - 防止已打开时调用UIDocument openWithCompletionHandler