我有我的主线程,我调用一个加载数据的方法(需要一段时间)。我用performSelectorInBackground调用此方法并传递委托。数据加载方法定期回调以更新进度,它调用最初在后台启动它的同一控制器类中的方法(委托)。此方法如下所示:
-(void)loadingProgress:(float)progress{
NSLog(@"Progress %f", progress);
myProgressView.progress = progress;
}
所以我知道该方法正在被调用并运行,因为我得到了日益增加的进度值的日志读数,但进度指示器没有移动。我发现的所有内容都声明确保主线程可以自由更新视图,但NSLog运行的事实并不意味着它是免费的吗?发生了什么事?
答案 0 :(得分:11)
您必须更新主线程上的用户界面元素。因此,您必须稍微改变一下方法,因为在使用performSelectorOnMainThread:withObject:waitUntilDone:
您的方法应如下所示:
-(void)loadingProgress:(NSNumber *)nProgress{
float progress = [nProgress floatValue];
NSLog(@"Progress %f", progress);
myProgressView.progress = progress;
}
你用它来称呼它:
[delegate performSelectorOnMainThread:@selector(loadingProgress:) withObject:[NSNumber numberWithFloat:progress] waitUntilDone:NO];