这个故事是从Perter每天上班开始说起的。。。(但这个不是一个好的开发流程,只是用来描述RunLoop工作而已)
第一章:故事描述
第一回合:Perter回到公司
每天Perter拖着疲惫的身躯搭上了地铁,慨叹广州地铁人真不少啊,回到公司打个卡,然后被产品经理看到他,产品经理就很高兴的走向Perter,说他昨晚想到了一个需求,噼里啪啦的说一轮,最后说,这个需求不急,今天完成就行。此刻Perter内心是奔溃的。
第二回合:Perter开始做需求
Perter回到自己的位置,拿到产品经理给的原型,打开Xcode,开始做需求了。做着做着,Perter发现产品经理给的原型有不合理的地方,然后就走到产品经理的位置上跟他讨论起来,接着以讨论结果,修改原型,继续做,然后做着做着又发现了原型不合理的地方,又去讨论,就这么来回了N次,期间还一直询问设计要切图,然后根据切图和产品原型,终于把功能需求做完了,最后告诉测试可以测试该功能了。
第三回合:测试开始测试功能
测试也按照着产品原型来测试功能,发现了个bug,然后就走过去跟Perter说,此时Perter正在休闲的喝着咖啡,翘个二郎腿的在看电影,测试心想做完需求就在偷懒了,现在bug来了,努力改bug吧,然后把产生bug的逻辑告诉Perter,Perter也是敬业的,马上关掉视频,正经的坐起来改bug了。这样也来回了N次,终于没bug了。
最后这样一天过去了,Perter也拖着疲惫的身躯回家了。但是故事还没完,噩梦在明天开始。
第四回合:新项目
Perter如旧拖着疲惫的身躯上班,然后又被产品经理看到他,产品经理就又很高兴的走向Perter,说他昨晚想到了一个需求,噼里啪啦的说一轮,最后说,这个是一个新项目,这个项目不急,今天完成就行。此刻Perter想到了一个产品经理因为改需求被程序员打的新闻,然后地下了头默默的去做新项目了。
因为旧的项目设计和测试都是原来的人,新的项目需要换一批人,所以Perter要切图和让测试去测试功能都需要找另外的人了,可是开发还是依然是Perter,心塞吗。
第五回合:故事总结
说到这里,故事差不多完了,但是我们不得不赞扬一下Perter,协调着产品原型,设计做图,当然也监听着测试提过来的bug,还同时维护着两个项目(其实极大可能以后再新增项目也给Perter维护),一天12小时运转,来回的“产品-设计-测试-产品-设计-测试-产品-设计-测试”,最后结论Perter是神一样的男人。
第二章:图片描述
用图来描述这个过程是这样的:
第一回合:Perter回到公司
看到了Perter,让Perter做新需求
产品经理------------------------------->Perter
第二回合和第三回合:Perter开始做需求和测试开始测试功能
Perter
|
| Perter发现不合理的地方,跟产品经理讨论
|---------------------------------------------->产品经理
| 讨论完,按照新的产品原型来继续做
|<----------------------------------------------产品经理
| Perter问设计要切图,然后把切图放到项目
|----------------------------------------------->设计
| Perter做好功能需求,提给测试去测试功能
|----------------------------------------------->测试
|
|------------|
| | Perter正在休闲的喝着咖啡,翘个二郎腿的在看电影,休息一下不用工作
|<---------- |
|
|
| 测试发现有问题,把bug逻辑告诉Perter,让Perter改
|<-----------------------------------------------测试
| Perter马上关掉视频,正经的坐起来改bug,改完告诉测试
|----------------------------------------------->测试
| 产品经理又有新需求
|------------------------------------------------------重新回合二
V
完成一天12小时的工作量,下班回家,明天继续来战。
第四回合:新项目
Perter
|
--------------------------------------------------------------------------------
| |
旧项目 新项目
| |
| | Perter发现不合理的地方,跟产品经理讨论
| |---------------------------------------------->产品经理
| | 讨论完,按照新的产品原型来继续做
| |<----------------------------------------------产品经理
| | Perter问设计要切图,然后把切图放到项目
| |----------------------------------------------->设计
| | Perter做好功能需求,提给测试去测试功能
| |----------------------------------------------->测试
| |
| 同右边一样,但是因为项目不一样,功能也不一样 |------------|
| | | Perter正在休闲的喝着咖啡,翘个二郎腿的在看电影,休息一下不用工作
| |<---------- |
| |
| |
| | 测试发现有问题,把bug逻辑告诉Perter,让Perter改
| |<-----------------------------------------------测试
| | Perter马上关掉视频,正经的坐起来改bug,改完告诉测试
| |----------------------------------------------->测试
| | 产品经理又有新需求
| |------------------------------------------------------回到回合一
V V
完成一天12小时的工作量,下班回家,明天继续来战。
第五回合:故事总结
因为项目剧情发展到两个项目,Perter在做新项目的时候,就要先放下旧项目,新项目和旧项目互斥着进行。所以整个故事的图片描述是:
看到了Perter,让Perter做新需求
产品经理------------------------------>Perter
|
--------------------------------------------------------------------------------
| |
旧项目 新项目
| |
| --->| Perter发现不合理的地方,跟产品经理讨论
| | |---------------------------------------------->产品经理
| 产| | 讨论完,按照新的产品原型来继续做
| 品| |<----------------------------------------------产品经理
| 经| | Perter问设计要切图,然后把切图放到项目
| 理| |----------------------------------------------->设计
| 又| | Perter做好功能需求,提给测试去测试功能
| 有| |----------------------------------------------->测试
| 新| |
| 同右边一样,但是因为项目不一样,功能也不一样 需| |------------|
| 求| | | Perter正在休闲的喝着咖啡,翘个二郎腿的在看电影,休息一下不用工作
| | |<---------- |
| 又| |
| 开| |
| 始| | 测试发现有问题,把bug逻辑告诉Perter,让Perter改
| 讨| |<-----------------------------------------------测试
| 需| | Perter马上关掉视频,正经的坐起来改bug,改完告诉测试
| 求| |----------------------------------------------->测试
| | |
| ---|
V V
完成一天12小时的工作量,下班回家,明天继续来战。
第三章:iOS描述
UIApplication开启一个主线程RunLoop,通知 Observers: RunLoop 即将进入 loop
UIApplication------------------------>RunLoop
|
--------------------------------------------------------------------------------
| |
kCFRunLoopDefaultMode UITrackingRunLoopMode
| |
| --->| 通知 Observers: RunLoop 即将触发 Timer 回调。
| | |---------------------------------------------->Observers
| dowhile| |
| 循| |
| 环| | 通知 Observers: RunLoop 即将触发 Source0 (非port) 回调。
| 保| |----------------------------------------------->Observers
| 证| | RunLoop 触发 Source0 (非port) 回调。
| 可| |----------------------------------------------->Source0(触摸)
| 以| |
| 同右边一样,因为RunLoopMode不一样,所以不在同一个dowhile 需| |------------|
| 不| | | 通知 Observers: RunLoop 的线程即将进入休眠(sleep)。
| 断| |<---------- |
| 处| |
| 任| |
| 务| | 调用 mach_msg 等待接受 mach_port 的消息。线程将进入休眠, 直到被下面某一个事件唤醒。
| | | 一个基于 port 的Source 的事件。
| | | 一个 Timer 到时间了
| | | RunLoop 自身的超时时间到了
| | | 被其他什么调用者手动唤醒
| | |<-----------------------------------------------Source,Timer,port或者是其他调用者手动唤醒
| | | 如果一个 Timer 到时间了,触发这个Timer的回调
| | | 如果有dispatch到main_queue的block,执行block。
| | | 如果一个 Source1 (基于port) 发出事件了,处理这个事件
| | |----------------------------------------------->调用唤醒者(Source,Timer,port或者是其他调用者)
| | |
| ---|
V V
通知 Observers: RunLoop 即将退出
总结
其实RunLoop是一个dowhile循环,循环内去处理iOS上需要处理的事情,来保证App的正常运行,就好比Perter上班后就要一直不断处理需求和bug来确保项目的维护,如果Perter不工作,项目也就停止维护了。
其实还有些细节没说,比如在iOS SDK上谁会监听RunLoop事件,需要处理的Source,Timer,port或者是其他调用者都实际上包括些什么,实际上RunLoop的应用等等
网友评论