卡顿发生机理

2015-10-13  本文已影响150人  叶舞清风

顾名思义,卡顿就是应用运行不流畅的现象,给用户的直观感受就是点击屏幕操作有停顿、响应缓慢、界面卡死等。

iOS应用中,所有的UI操作以及更新,都是在主线程中完成,并且主线程的runloop是逐个处理用户事件的(当然其他的runloop也一样),所以主线程必须等待上一次事件处理完成后才能继续响应下一次事件。

( Runloop:是事件接收和分发机制的一个实现。Runloop提供了一种异步执行代码的机制,不能并行执行任务。在主队列中,Main RunLoop直接配合任务的执行,负责处理UI事件、定时器以及其他内核相关事件。RunLoop的主要目的:保证程序执行的线程不会被系统终止。Runloop工作的特点:

1> 当有事件发生时,Runloop会根据具体的事件类型通知应用程序作出响应;

2> 当没有事件发生时,Runloop会进入休眠状态,从而达到省电的目的;

3> 当事件再次发生时,Runloop会被重新唤醒,处理事件。

提示:一般在开发中很少会主动创建Runloop,而通常会把事件添加到Runloop中。)

在 iOS 应用启动后,系统会自动创建主线程并开始运行它的 runloop,监听处理分发事件,当没有事件发生时进入休眠状态,有事件发生时系统会将接收到的事件放在一个队列里,然后唤醒 runloop 依次处理事件。

绝大部分用户感知到的卡顿就是由于主线程阻塞了,在处理某次事件消耗了过长的时间,导致主线程处于等待状态,无法及时响应用户的下一次输入事件。

由于iOS 上的 UIKit 只能在主线程进行处理,导致开发者在开发过程中不经意间在主线程做了一些消耗时间的工作,导致了应用卡顿。

解决办法:充分利用好 iOS 的多线程,如 NSThread、NSO peration Queue,GCD 等干脏活,累活,让主线程能及时迅速的响应用户事件。

上一篇下一篇

猜你喜欢

热点阅读