[英]Updating UILabel on UIView from the main queue's callback
在我的iOS应用中,用户可以打开从磁盘加载的项目。 这需要一些时间,因此我展示了我的自定义加载视图,它是UIView的子类。 该加载视图具有一个类似于进度条的标签。 我试图不断更新其价值。
这是第一种方法(我简化了代码):
// in view controller, which has projects list
[self performSelectorInBackground:@selector(openLoading) withObject:nil];
[projectsManager loadProject:project statusChangedCallback: ^(NSString* status){
self.loadingDialog.progressString = status;
}];
[self closeLoading];
// in ProjectsManager
-(void) loadProject:(NSString*)project statusChangedCallback:(void(^)(NSString* status))callback
{
callback(@"Loading some data...");
[self loadSomeDataFrom:project];
callback(@"Loading other data...");
[self loadOtherDataFrom:project];
}
这种方法行不通(UILabel无法更新),因为我在一个循环周期内从主队列中多次对其进行了更新。 我还尝试了不同的方法,例如:
[projectsManager loadProject:project statusChangedCallback: ^(NSString* status){
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
self.loadingDialog.progressString = status;
});
}];
但由于相同的原因,后台对标签的这种更新不太可能起作用-主循环已停止。 我想将所有项目加载都放到后台线程中,因此不会影响主循环,但这是不可能的,因为项目加载与某些只能在主线程中执行的OpenGL纹理加载紧密相关。
我也尝试发送-setNeedsDisplay进行查看,但这也没有用。
那么,如何在主队列繁忙时更新标签? 也许我需要更改呈现加载视图机制的体系结构?
这些值没有得到更新,因为您正在使用后台队列,并且无法在主线程dispatch_get_global_queue
之外的任何线程中更新UI,仍然使用后台线程,对于UI中的任何更改都使用dispatch_get_main_queue
。
尝试:
dispatch_async(dispatch_get_main_queue(),^ {self.loadingDialog.progressString = status;})
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.