ios-多线程技术在开发中的应用场景

本文探讨了在自定义UICollectionView时如何运用多线程技术解决初始化阶段无法直接操作UI元素的问题。通过具体示例介绍了如何利用DispatchQueue.main.async在主线程上安全地执行UI更新,包括滚动到指定位置及监听属性变化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们可能学习了多线程之后,觉得几乎都用不到多线程,因为如果用第三方框架,都已经给我们封装好了。这里举两个例子,用到多线程的概念的。

如果我们自定义了一个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)
        }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值