0

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

4

1 回答 1

1

听起来您可能更适合通过 dispatch_async() 到主队列,或者(为了处理 runloop 模式和重入)CFRunLoopPerformBlock()。

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

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

于 2013-09-30T21:13:30.917 回答