我们可能学习了多线程之后,觉得几乎都用不到多线程,因为如果用第三方框架,都已经给我们封装好了。这里举两个例子,用到多线程的概念的。
如果我们自定义了一个collectionView之后,在初始化方法中想要调用下面这个方法
self.collectionView.scrollToItem(at: indexPath, at: .left, animated: false)
是不可能的,因为那个时候还没有数据,是到不了我们希望的指定的数据但是我们这个时候就可以用到多线程的知识了。因为主队列中异步执行其实就是主线程顺序的执行,不过需要的是把主线程上的任务都先完成,再去执行主队列当中的任务。
DispatchQueue.main.async {
//当把UI界面设置完成,主线程上的任务都完成,消息循环快要结束的时候调用下面这个,滚动到相应的位置
self.collectionView.scrollToItem(at: indexPath, at: .left, animated: false)
}
还有种方式也差不多,就是我们在初始化方法中想去监听某个属性的变化,但是那个属性在初始化的时候可能会发生变化,如果我们不想这么早去监听,我们也可以调用下面这个方法来实现,使用KVO监听位置的变化,把任务添加到主队列中,如果主线程中有任务,就不调度队列中的任务执行,这里就是让当前运行循环中的代码都执行完成之后,在运行循环结束之前监听这个frame的改变
DispatchQueue.main.async {
self.addObserver(self, forKeyPath: "frame", options: [], context: nil)
}