0

我有这个优化问题。我在 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 在这些 customView 上相当繁重,我需要能够创建大约 50 个并将它们放置在不阻塞 mainThread 的情况下。使用带有框架的 init 创建它们需要 170 毫秒,而将它们作为子视图放置在我的 vc 中需要 350 多毫秒。在这种情况下,有什么建议可以减轻主线程的负载吗?也许程序化方法会比笔尖更好?

4

1 回答 1

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.
    });
});

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

于 2015-10-18T20:10:57.777 回答