iOS事件
iOS事件,代表手指触摸应用视图或者用户摇晃设备。 当手指触摸或者摇晃设备时,iPhone的多触摸系统就会注册这些触摸作为事件,并把他们发送给当前应用去处理。
事件循环
在主事件循环中,一个应用持续把接收到的事件路由到相应的对象上去处理,处理结果由对象去呈现并记录状态。 一个事件循环,就是一个简单的run-loop。 run-loop ,周期运行并平衡处理从各种绑定的数据源接受到的事件。 每一个线程,都有一个run-loop。除了主线程之外,其它线程的run-loop必须由代码配置启动,主线程中的run-loop , 是由应用自动运行的 。 主线程的run-loop和其它线程的run-loop ,区别之处在于,主线程run-loop的输入源从操作系统接受事件,这些事件都是由用户产生的, 例如: 点击view或者用键盘输入文本等。
事件处理流程
应用一旦启动,它就会为主事件循环做一些初始化操作, 应用会和底层负责转发用户事件的组件建立连接。 应用通过安装在主线程的run-loop的输入源接收事件。 因为应用必须单独并有序的处理每一个事件,所以这些事件会被放到一个先进先出的事件队列中。
一旦应用界面出现在屏幕上,应用就被事件驱动。 应用获取队列中最顶层的事件,然后分发给应用中对应的对象去处理。 当分发过程完成后,应用就会从队列中取出下一个事件并再次分发,一直循环,直到应用终止。
当应用获取到事件,会被分发给发生事件的window,window再分发事件给最适合处理它的视图view上, 也就是知名的hit-test-view(前提条件,必须是UIResponder对象或者派生类,而且有意愿成为第一响应者。- (BOOL)canBecomeFirstResponder { return YES; }
)。 如果这个view不能处理这个事件, 事件会沿着响应者链向上进行传递,直到被处理或者被丢弃。
响应者链
响应者链,可以理解为链表。
响应者链,允许response对象,有责任转发待处理事件给其它对象。 待处理事件,向上传递,直到被处理或被丢弃。
对iOS来说,响应者链顺序如下(其中controller,看实际情况,有或者没有 ,但大多数情况都会有):
view -> parent view -> parent view -> …(parent view)… [-> controller] -> window - application
例如,如果一个视图view由view controller管理,那么如果view无法处理事件,则view controller成为next responder