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