objective-c – 在Cocoa应用程序中阻止主线程时,UI不会更新

objective-c – 在Cocoa应用程序中阻止主线程时,UI不会更新,第1张

概述我在我的主线程中使用NSProgressIndicator来更新进度,因为我运行了整个方法.现在,当我最终从另一个类文件调用一个对象,并等待该对象返回到我的主线程的值时,我注意到NSProgressIndicator将消失.我知道这是因为主线程被阻塞,直到我从另一个对象获得返回值. 所以我的问题是在主线程中更新UI而不阻塞它并让其他对象在后台运行并根据需要将值返回给主线程的推荐方法是什么.我知道如 我在我的主线程中使用nsprogressIndicator来更新进度,因为我运行了整个方法.现在,当我最终从另一个类文件调用一个对象,并等待该对象返回到我的主线程的值时,我注意到nsprogressIndicator将消失.我知道这是因为主线程被阻塞,直到我从另一个对象获得返回值.

所以我的问题是在主线程中更新UI而不阻塞它并让其他对象在后台运行并根据需要将值返回给主线程的推荐方法是什么.我知道如何使用块,但不允许块 *** 作返回值.
我需要的是帮助这个伪代码的东西:

-(IBAction) main {//Update progress indicator UI to show progress//perform an call to another object from another class.// wait till i get its return value.//Update progress indicator UI to show progress// Use this return value to do something.//Update progress indicator UI to show progress}

当调用另一个对象时,我注意到确定的nsprogressIndicator我已经完全消失,因为主线程被阻塞了.谢谢.

解决方法 您的上述代码不是正确的方法.由于main永不返回,因此进度指示器永远不会更新.您必须快速返回主线程.

相反,您要做的是设置一个后台块,在不同的点上更新主线程上的进度指示器.所以,例如:

- (IBAction)start:(ID)sender {  dispatch_queue_t queue = dispatch_get_global_queue(disPATCH_QUEUE_PRIORITY_DEFAulT,0);  dispatch_async(queue,^{    dispatch_async(dispatch_get_main_queue(),^{[self.progress setProgress:0];});    // Doing some stuff    dispatch_async(dispatch_get_main_queue(),^{[self.progress setProgress:.25];});    // Doing more stuff    dispatch_async(dispatch_get_main_queue(),^{[self.progress setProgress:.75];});  });}

(是的,这会导致队列保留自己,但这样就可以了,因为self没有保留队列.)

总结

以上是内存溢出为你收集整理的objective-c – 在Cocoa应用程序阻止主线程时,UI不会更新全部内容,希望文章能够帮你解决objective-c – 在Cocoa应用程序中阻止主线程时,UI不会更新所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1220790.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-05
下一篇2022-06-05

发表评论

登录后才能评论

评论列表(0条)

    保存