IOS 从笔尖加载视图
IOS loadingView from nib
我有这个优化问题。我在 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 对这些自定义视图非常有用,我需要能够创建大约 50 个自定义视图并将它们放置在周围而不阻塞 mainThread。使用带框架的 init 创建它们需要 170 毫秒,将它们作为子视图放置在我的 vc 中需要 350 毫秒。在这种情况下如何减轻主线程的负载有什么建议吗?也许编程方法会比 nib 方法更好?
只需在后台线程中执行实际加载,完成后 - 将引用传回主线程,同时显示一个纺车或其他东西(如果需要的话):
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.
});
});
这样您将在并行线程中完成繁重的工作,同时保持主线程空闲。
我有这个优化问题。我在 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 对这些自定义视图非常有用,我需要能够创建大约 50 个自定义视图并将它们放置在周围而不阻塞 mainThread。使用带框架的 init 创建它们需要 170 毫秒,将它们作为子视图放置在我的 vc 中需要 350 毫秒。在这种情况下如何减轻主线程的负载有什么建议吗?也许编程方法会比 nib 方法更好?
只需在后台线程中执行实际加载,完成后 - 将引用传回主线程,同时显示一个纺车或其他东西(如果需要的话):
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.
});
});
这样您将在并行线程中完成繁重的工作,同时保持主线程空闲。