繁体   English   中英

从主队列的回调中更新UIView上的UILabel

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM