【问题标题】:IOS loadingView from nib来自笔尖的IOS loadingView
【发布时间】:2015-10-18 17:02:05
【问题描述】:

我有这个优化问题。我在 nib 中有一个由图片和标签组成的视图。这是我从笔尖加载它的方式:

@IBOutlet weak var imageView: UIImageView!
var view: UIView!
let nibName = "customView"

override init(frame: CGRect) {
    super.init(frame: frame)
    setup()
}

public required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    setup()
}

func setup() {
    view = loadFromNib()
    view.frame = self.bounds
    imageView.image = CustomView.defaultImage
    addSubview(view)
    setupProfileView()
}

func loadFromNib() -> UIView {
    let bundle = NSBundle(forClass: self.dynamicType)
    let nib = UINib(nibName: nibName, bundle: bundle)
    let view = nib.instantiateWithOwner(self, options: nil)[0] as! UIView
    return view
}

每次加载都需要相当长的时间。我的 UI 在这些 customViews 上相当繁重,我需要能够创建大约 50 个并将它们放置在周围而不阻塞 mainThread。使用带有框架的 init 创建它们需要 170 毫秒,将它们作为子视图放置在我的 vc 中需要 350 多毫秒。在这种情况下,有什么建议可以减轻主线程的负载吗?也许编程方法会比笔尖更好?

【问题讨论】:

  • 您是否同时在屏幕上显示了 50 个不同的自定义视图?为什么你的屏幕这么忙?屏幕截图可能与此处相关。
  • 屏幕上更像 20-25,您可以滚动查看其他人。

标签: ios multithreading swift uiview uinib


【解决方案1】:

只需在后台线程中进行实际加载,一旦完成 - 将引用传回主线程,同时显示一个纺车或其他东西(如果你想要并且如果需要的话):

dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0), ^{
    // Load your NIB here.

    dispatch_async(dispatch_get_main_queue(), ^{
        // Pass reference to main queue here.
    });
});

这样您将在并行线程中完成繁重的工作,同时保持主线程空闲。

【讨论】:

  • 这真的有用吗?因为后台线程上的框架效果不佳。我会试一试,并尽快通知您。
  • 好的,这确实改善了一些事情。有什么办法让它画得更快吗?也就是说,addSubviews 仍然需要一段时间。
  • 不,你应该在主线程上添加子视图,因为它是与界面的操作,这应该总是在主线程上完成。您可以做的是在后台线程中加载您需要的所有内容,然后通过一次调用主线程添加所有这些子视图(如果您有很多 NIB)。
  • 既然你有很多,要么显示一个微调器或其他东西,要么在屏幕显示之前做所有这些,比如viewWillAppear: 或其他东西,让这个等待子视图不看起来很尴尬。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-10
  • 1970-01-01
  • 2012-07-07
相关资源
最近更新 更多