为什么要在主线程更新UI?

因为子线程代码执行完毕了,又自动进入到了主线程,执行了子线程中的UI更新的函数栈,这中间的时间非常的短,就让大家误以为分线程可以更新UI。如果子线程一直在运行,则子线程中的UI更新的函数栈 主线程无法获知,即无法更新

只有极少数的UI能,因为开辟线程时会获取当前环境,如点击某个按钮,这个按钮响应的方法是开辟一个子线程,在子线程中对该按钮进行UI 更新是能及时的,如换标题,换背景图,但这没有任何意义

UI操作并不是线程安全的,多线程更新UI会造成死锁,竞争条件等多种问题。iOS推荐UI操作在主线程中进行,避免出现crash等无法预知的问题。比如TableView的刷新,有可能线程a往模型数组中添加了数据并刷新tableView,tableView调用了- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section得知每组cell的个数,但是就在tableView调用- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath方法的时候,线程b将模型数组里面的数据删除干净了,如果此时在- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath方法里访问模型数组,就会出现数组越界,这在网络请求数据的时候很容易出现,一定要确定数据返回的block或者delegate是在哪个线程,如果是子线程一定要回主线程刷新UI。

转载于:https://my.oschina.net/jlongtian/blog/856995

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值