我有一个问题。我有一个UITableView和一个带有UIProgressView的视图,当我滚动表格时,progressview不会刷新进度值...只有当滚动完成后,才会刷新进度..
我不知道为什么会这样。 我尝试使用dispatch_async
刷新进度dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void){
//I don't know what i have to put here, maybe the NSTimer??
dispatch_async(dispatch_get_main_queue(), ^(void){
//here i set the value of the progress
});
});
但没有任何改变......
答案 0 :(得分:2)
你快到了!
我已经复制了你的问题并修复了它。
这是没有修复,这是我认为你有的问题(请注意滚动时进度指示器不会更新):
这就是修复:
问题是滚动也发生在主线程上并阻塞它。要解决此问题,您只需要对计时器进行一些小调整即可。初始化计时器后,添加:
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
以下是一些最小代码示例:
-(instancetype)init{
self = [super init];
if (self) {
_progressSoFar = 0.0;
}
return self;
}
- (void)viewDidLoad {
[super viewDidLoad];
self.progressIndicator.progress = 0.0;
self.myTimer = [NSTimer scheduledTimerWithTimeInterval: 0.1 target: self selector: @selector(callAfterSomeTime:) userInfo: nil repeats: YES];
[[NSRunLoop currentRunLoop] addTimer:self.myTimer forMode:NSRunLoopCommonModes];
[self.myTimer fire];
}
-(void)callAfterSomeTime:(NSTimer *)timer {
if (self.progressSoFar == 1.0) {
[self.myTimer invalidate];
return;
}
// Do anything intensive on a background thread (probably not needed)
dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void){
// Update the progress on the main thread
dispatch_async(dispatch_get_main_queue(), ^{
self.progressSoFar += 0.01;
self.progressIndicator.progress = self.progressSoFar;
});
});
}
滚动发生在UITrackingRunLoopMode
。您需要确保您的计时器也处于该模式。你不应该需要任何后台线程的东西,除非你做一些花哨的计算,但我已经包括它以防万一。只需在global_queue
调用中但在主线程调用之前执行任何密集的操作。