来自笔尖的IOS loadingView

Posted

技术标签:

【中文标题】来自笔尖的IOS loadingView【英文标题】:IOS loadingView from nib 【发布时间】: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,您可以滚动查看其他人。 【参考方案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: 或其他东西,让这个等待子视图不看起来很尴尬。

以上是关于来自笔尖的IOS loadingView的主要内容,如果未能解决你的问题,请参考以下文章

swift 来自笔尖的UIView

来自笔尖的自定义 UiTableViewCell 没有重用?

来自笔尖的 NSWindowController 子类初始化不使用 -initWithCoder:?

iOS:笔尖中的 TableView - 设置背景颜色

iOS:从笔尖加载自定义 UIView

iOS:从笔尖重写到情节提要