iphone - 允许 View 完全重绘,然后在主线程上执行操作

标签 iphone ios uikit grand-central-dispatch

我有一些自定义 UIControl,其状态从正常变为按下再变为选定。根据应用程序的逻辑,当用户抬起手指时,应该选择该控件,并且应该加载一些 View 。 View 相当大,包含大量数据和复杂 View 。因此,结果是,当用户抬起手指时,显示屏会卡住大约 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 只是一个猜测,我可能不必要地将 View 出现延迟 0.05。我真正想要发生的是让 View 在选定状态下使用按钮完成刷新,然后立即执行较长的运行任务。有没有更好的方法来安排此操作的时间?我应该为此使用dispatch_after吗?

最佳答案

听起来您可能更好地服务于主队列的 dispatch_async(),或者(为了处理运行循环模式和重入)CFRunLoopPerformBlock()。

这会让您将控制权返回给主线程,这样它就可以做一些事情,然后在它下次开始处理事件时运行。

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

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

相关文章:

ios - 告诉 Action 扩展的后台状态

iphone - objective-c 中的SimpleDateFormat解析时间函数

iOS UIImagePickerControllerSourceTypeCamera 全屏照片无法捕获

ios - 带有 2 个文本字段的 UIDatePicker(从/到日期)?

ios - subview 何时完全、正确地布局?

具有动态高度的 iOS UIView 取决于内部元素的数量

android - 如何锁定屏幕旋转,即即使我在 ios 和 android 中转动设备,它也不应该旋转到横向

ios - 如何修复 iOS 模拟器问题?

iphone - 使用铃声作为 iOS 的自定义推送通知声音

ios - 如何返回当前 View Controller ?