Ios 从主队列更新UIView上的UILabel';s回调

Ios 从主队列更新UIView上的UILabel';s回调,ios,objective-c,multithreading,uiview,Ios,Objective C,Multithreading,Uiview,在我的iOS应用程序中,用户可以打开从磁盘加载的项目。这需要一些时间,所以我展示了我的定制加载视图,它是UIView的子类。此加载视图有一个类似于进度条的标签。我一直在努力更新它的价值 这里是第一种方法(我稍微简化了我的代码): 这种方法不起作用(UILabel不更新),因为我在一个循环周期内从主队列多次更新它。我还尝试了不同的方法,如: [projectsManager loadProject:project statusChangedCallback: ^(NSString* status)

在我的iOS应用程序中,用户可以打开从磁盘加载的项目。这需要一些时间,所以我展示了我的定制加载视图,它是UIView的子类。此加载视图有一个类似于进度条的标签。我一直在努力更新它的价值

这里是第一种方法(我稍微简化了我的代码):

这种方法不起作用(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\u get\u global\u queue
之外的任何线程中都不可能更新UI,仍然使用后台线程,使用
dispatch\u get\u main\u queue
查看UI中的任何更改

尝试:

dispatch\u async(dispatch\u get\u main\u queue()^{ self.loadingDialog.progressString=状态; })


也试过了,没用。。。这段代码可能与不使用
dispatch\u async
的代码几乎相同,因为所有操作都在主队列中执行。
[projectsManager loadProject:project statusChangedCallback: ^(NSString* status){ 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
        self.loadingDialog.progressString = status;
    });
}];