C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了objective-c – 在Cocoa应用程序中阻止主线程时,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不会更新所遇到的程序开发问题。

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

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。