背景需求:APP启动之后要做ping -c 5 hostA 与 ping -c 5 hostB操作,并计算出min、avg、max耗时与方差。
期望效果:在封装的启动方法中调用自己封装的startPing接口,通过performSelector:withObject:afterDelay重复调用ping:host:callback,最终根据每次ping结果计算耗时相关数据。
实际效果:ping方法没有被重复调用。
分析原因:startPing接口在子线程中被调用,子线程没有runloop,而performSelector:withObject:afterDelay正常执行需要有runloop
问题处理:在ping:host:callback方法调用CFRunLoopRun()。
期望效果:pingHostA与pingHostB都可以正常执行callback。
实际效果:pingHosB没有执行
分析原因:CFRunLoopRun()会让ping:host:callback循环执行,堆栈无法执行到pingHostB。
问题处理:在pingHostA的callback中执行CFRunLoopStop(CFRunLoopGetCurrent()),用以结束当前循环
期望效果:pingHostB可以执行callback。
实际效果:pingHostB正常执行callback。
流程图:
总结:
1、子线程执行performSelector:withObject:afterDelay需要开启runloop
2、开启runloop方法:CFRunLoopRun()
3、关闭runloop方法:CFRunLoopStop(CFRunLoopGetCurrent())
网友评论