允许视图完全重绘,然后在主线程上执行操作

时间:2013-09-30 20:57:58

标签: iphone ios uikit grand-central-dispatch

我有一些自定义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吗?

1 个答案:

答案 0 :(得分:1)

听起来你可能更好地服务于dispatch_async()到主队列,或者(为了处理runloop模式和重入),CFRunLoopPerformBlock()。

这将让你将控制权交还给主线程,这样它就可以做到这一点,然后在下一次处理事件后再运行。

当然,更好的方法是,如果你可以通过优化视图和查看层次结构来完全避免在主线程上完成400毫秒的工作。