在启动一个应用程序时,系统会为应用程序创建一个进程和一个线程。这个初始线程成为应用程序的主线程,UIApplication实例会在这个线程中设置主运行循环(main RunLoop),以及配置应用程序的事件处理逻辑。主运行循环被用来处理事件以及更新到视图接口上,由于运行在主线程上,主运行循环可以保证按接收到的顺序连续处理用户交互的事件。运行循环(RunLoop)负责监视指定线程的输入源:当输入源有数据需要处理时,运行循环就唤醒相应的线程,并将控制权交给输入源的处理代码;在处理完成任务后将控制权交回运行循环,运行循环就处理下一个事件;如果没有其他事件,运行循环会使线程进入休眠状态。读者可以通过Foundation框架和NSRunLoop类安装自己的输入源,包括端口和定时器。
图9.1.2展示了主运行循环的体系结构以及用户的触摸事件是如何对应用程序运行产生影响的。当用户与设备交互时,与这些交互相关的事件会由iOS系统生成,并通过UIKit设置的特殊端口传送到应用程序,分发给相应的响应者。响应者对象是继承自UIResponder类的对象,实现了一个或多个事件方法,以处理触摸事件不同阶段发生的事件。应用程序的响应者对象包括UIApplication、UIWindow、UIView及所有UIView子类的实例。应用程序通常将事件派发给代表应用程序主窗口(Main Window)对象,然后由窗口对象将事件传递给它的第一个响应者,通常是发生触摸事件的视图(UIView)对象。
图9.1.2 在主循环中处理手势事件(www.xing528.com)
除了定义事件处理方法之外,UIResponder类还定义了响应者链的编程结构。响应者链是为实现Cocoa协作事件处理而设计的机制,由应用程序中一组链接在一起的响应者对象组成,通常以第一响应者作为链的开始。当发生某个事件时,第一响应者对象不能处理,就将其传递给响应者链中的下一个对象,消息在链中传递,从底层的响应者对象到诸如窗口、应用程序和应用程序委托这样的高级响应者对象,直到事件被处理。如果事件最终没有被处理,就会被丢弃。
进行事件处理的响应者对象可能发起一系列程序动作,结果导致应用程序重画全部或部分用户界面(也可能导致其他结果,如播放一个声音)。例如,一个控件对象(也就是一个UIControl的子类对象)在处理事件时向另一个对象(通常是控制器对象,负责管理当前活动的视图结合)发送动作消息,在处理这个动作消息时,控制器可能以某种方式改变用户界面或视图的位置,而这又要求某些视图对自身进行重画。如果这种情况发生,则视图和图形基础组件会接管控制权,会以最有效的方式处理必要的重画事件。
在iOS的多点触摸事件模型中,触摸数据被封装在事件对象(UIEvent)中。为了跟踪触摸动作,事件对象中包含一些触摸对象(UITouch),每个触摸对象都对应于一个正在触摸屏幕的手指。当用户把手指放在屏幕上,然后四处移动,并最终离开屏幕时,系统通过对应的触摸对象报告每个手指的变化。关于事件的知识将会在第12章详细展开。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。