我的应用程序中有一个小问题MBProgressHUD。
基本上我以最简单的方式使用它来实现它:
[MBProgressHUD showHUDAddedTo:self.view animated:YES];
[self performSelector:@selector(save) withObject:nil afterDelay:0.001];
[self refreshView];
方法refreshView在执行结束时有这一行:
[MBProgressHUD hideHUDForView:self.view animated:YES];
MBProgress确切地显示它应该如何,但是对于它的持续时间的最后一半(ish),它会逐渐消失到几乎不可见的状态,使得它看起来好像方法在它们实际完成之前已经完成执行。
关于这里可能出现什么问题的任何想法?
非常感谢!
答案 0 :(得分:2)
如果没有看到更多代码,很难提供精确的解决方案。但基本上问题可能与您在调用[self refreshView]
方法之前调用[MBProgressHUD hideHUDForView:self.view animated:YES]
并因此调用save
这一事实有关。为什么不在save
方法的末尾隐藏HUD,或者直接调用save
而不是在延迟之后。我不确定为什么你必须在延迟后执行保存。
答案 1 :(得分:2)
您需要了解的概念是运行循环。运行循环是程序中的内部循环,用于处理传入的事件,定时器,网络等(它由系统提供并运行,因此您实际上不会在代码中看到此循环。)
这一行:
[self performSelector:@selector(save) withObject:nil afterDelay:0.001];
您计划在{1}之后运行-save
操作。 (或者以后,如果主线程忙于做其他事情)
在安排此-save
之后(所以正在运行之后),请拨打隐藏HUD的refreshView
。
所以实际发生的是你一次显示和隐藏HUD。所以你会看到类似于显示和隐藏它的组合动画。独立地,您的-save
方法被调用。
与UIAdam的建议相反,你确实需要performSelector:afterDelay:
,因为你需要给运行循环一些时间来呼吸并在屏幕上显示你的眼睛糖果。用户界面的更改不会立即发生,而是仅在程序返回到运行循环时才会发生。
因此,修正是这一行:
[self refreshView];
并将其移至-save
方法的末尾。