我有一些自定义UIControl,其状态从正常变为按下变为选中状态。根据应用程序的逻辑,当用户松开手指时,应选择控件,并应加载一些视图。该视图相当大,包含大量数据和复杂的视图。因此,结果是当用户抬起手指时,显示屏冻结大约100-400毫秒,然后显示用户期望的内容。在选择状态下看到控件之前的长时间延迟感觉就像是一个错误。为了修复它,我做了以下工作:

-(IBAction)didTapControl:(UIControl*)sender{
    sender.selected = YES;
    double delayInSeconds = 0.05;
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
        //perform some long running task
    }
}


但是,0.05只是一个猜测,我可能不必要地将视图外观延迟了0.05。我真正想发生的事情是在按钮处于选定状态时完成视图刷新,然后立即执行运行时间更长的任务。有没有更好的计时该动作的方法?我应该为此使用dispatch_after吗?

最佳答案

听起来,最好将dispatch_async()送至主队列,或者(为了处理运行循环模式和重入)CFRunLoopPerformBlock()。

这将使您将控制权返回给主线程,以便它可以完成工作,然后在下次处理事件时运行。

当然,如果您可以通过优化视图和视图层次结构完全避免在主线程上执行400毫秒的工作,那就更好了。

关于iphone - 允许 View 完全重绘,然后在主线程上执行操作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19103701/

10-13 04:17