首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当主线程被阻塞时,没有及时显示MBProgressHUD。

当主线程被阻塞时,没有及时显示MBProgressHUD。
EN

Stack Overflow用户
提问于 2014-08-28 12:16:24
回答 1查看 2.1K关注 0票数 1

我正在开发一个使用cocos2d-x的游戏,我在ipad 1这样的老设备上遇到了问题,在这些设备上,大场景需要很长时间才能加载。所以场景转换需要几秒钟的时间,所以在加载新场景时,我尝试在场景转换之间实现一个“繁忙”动画。我在IOS上使用MBProgressHUD实现了这个功能,在android上使用ProgressDialog实现了这个功能。我决定我不想立即开始显示这个动画,相反,我可以安排动画在场景转换开始后1-2秒开始,这样在较新的设备上动画就不会显示。最初我所做的是:

代码语言:javascript
复制
- (void) showProgressDialog: (int) runWithoutDelay
    {
    [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(showProgressDialogAfterDelay) object:nil];
    shouldShow = YES;
    if (runWithoutDelay){
        [self showProgressDialogAfterDelay];
    }
   else{
       [self performSelector:@selector(showProgressDialogAfterDelay) withObject:nil   afterDelay:delay];
       }
   }

- (void) showProgressDialogAfterDelay
  {
   if (shouldShow){
       isShown = YES;
       [progressHUD show:YES];
   }

}

如果我传递场景转换部分,我只会将shouldShow标志设置为false,并且不会启动动画。问题是,由于cocos2d-x场景转换是在main\ui线程中完成的,有时不是在2秒后调用show方法,因此调用它需要6到8秒,有时甚至在我将标记设置为false之后调用。据我所理解,这是因为performSelector (以及我也尝试过的NSTimer )通过将调用放在线程运行循环队列中在同一个线程上运行。我需要一些需要延迟的东西,所以我尝试使用performSelectorInBackground (尽管我仍然不知道如何取消它,就像创建一个新的时间表时需要取消以前的计划一样),但根据Xcode的日志,这看起来更准确,但是即使日志上说这个方法是在被计划的2秒后调用的,显示时间还是需要5-8秒,有时甚至根本不显示。据我所知,如果我错了,请纠正我,因为MBProgressHUD更改UI必须发生在main\UI线程上,所以即使我调用ProgressHUD显示:是的,在后台线程上,UI的实际更新计划以某种方式在主线程上执行,而且由于它被卡在cocos2d-x上,所以在场景转换完成后,当场景转换完成时,它才会开始显示。

有办法解决这个问题吗?我可以以某种方式安排它以延迟开始,但是当我想要它的时候,它会显示正确吗?

我不明白的是,如果我毫不拖延地启动它,动画工作就会顺利,而不会被卡住,即使主线程忙于cocos2d-x处理。

EN

回答 1

Stack Overflow用户

发布于 2015-03-07 03:14:07

我设法绕过了这一切!

  1. 创建一个普通方法,在该方法中调用progressHUD并调用第二个
  2. 创建第二种方法,您可以在其中完成耗时的工作(加载视图)
  3. 在主线程上执行该方法。

示例:

代码语言:javascript
复制
-(void)callHUD {

            [progressHUD show];

            dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
                [self performSelectorOnMainThread:@selector(loadView) withObject:nil waitUntilDone:YES];
                dispatch_async(dispatch_get_main_queue(), ^{
            [progressHUD dismiss];
    });
});
}

-(void)loadView {
    //Perform your segue or transition which needs to load
}

希望能对你有所帮助。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25548625

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档