把大多数nonUI代码放在后台线程中?

时间:2016-09-21 13:35:23

标签: ios swift multithreading

将大多数非UI代码放在后台线程中以改善UI体验是一个好主意吗?特别是在ViewDidLoad中?下面是我的viewDidLoad代码,我已经评论了我认为我可以放置后台线程

override func viewDidLoad() {
    super.viewDidLoad()

    // Put this in background thread?
    placesClient = GMSPlacesClient.sharedClient()

    // Put this in background thread?
    postDescriptionTxtView.delegate = self

    // Put this in background thread?
    let hideTap = UITapGestureRecognizer(target: self, action: #selector(myVC.hideKeyboard))
    hideTap.numberOfTapsRequired = 1
    view.userInteractionEnabled = true
    view.addGestureRecognizer(hideTap)

    whiteViewForEditImgBtn.layer.cornerRadius = whiteViewForEditImgBtn.frame.width / 2
    whiteViewForEditImgBtn.layer.masksToBounds = true

    selectedImageView.image = imageFromPreviousVC

    contentView.backgroundColor = COLOR_BACKGROUND_POSTVC
    postBtn.backgroundColor = COLOR_BUTTON
    topView.backgroundColor = COLOR_NAVIGATION_BARTINT
}

1 个答案:

答案 0 :(得分:3)

仅在操作延迟渲染屏幕的情况下,将操作移动到后台线程才能改善用户体验。这种情况发生在两种情况下 - 当操作是CPU密集型时,以及当操作进入等待状态时,例如,等待网络请求完成。

我们可以估计一个操作需要CPU占用多少,以便我们考虑将其从UI线程中移除。假设1.3 GHz的核心速度和60的FPS速率,我们在渲染两个连续帧之间有大约2,000,000个CPU周期。如果您的操作需要比此更多的周期,您可以考虑将其移动到单独的线程中。

相比之下,使用网络等待的操作可能需要不可预测的长时间才能完成,因此应该避免在UI线程上运行它们。

您的示例可能适合大约100条指令,计算作为其调用的方法的一部分执行的指令。由于您的示例也没有进行网络调用,因此将其移至后台线程会引入不必要的复杂性,而不会提供任何回报。