IOS开发入门之RunLoop与GCD、AutoreleasePool解析
凌雪 2018-10-23 来源 :网络 阅读 1633 评论 0

摘要:本文将带你了解IOS开发入门iOS多线程基础之RunLoop与GCD、AutoreleasePool解析,希望本文对大家学IOS有所帮助。

本文将带你了解IOS开发入门iOS多线程基础之RunLoop与GCD、AutoreleasePool解析,希望本文对大家学IOS有所帮助。


       

iOS多线程基础之RunLoop与GCD、AutoreleasePool解析本系列文章主要讲解iOS中多线程的使用,包括:NSThread、GCD、NSOperation以及RunLoop的使用方法详解,本系列文章不涉及基础的线程/进程、同步/异步、阻塞/非阻塞、串行/并行,这些基础概念,有不明白的读者还请自行查阅。

RunLoop的执行者   __CFRunLoopRun源码解析

这一部分先来看一下真正执行RunLoop循环的源码:


 


   

<code><code>static int32_t __CFRunLoopRun(CFRunLoopRef rl,   CFRunLoopModeRef rlm, CFTimeInterval seconds, Boolean stopAfterHandle,   CFRunLoopModeRef previousMode) {

    //获取一个CPU滴答数的时间,精度在纳秒级

    uint64_t startTSR =   mach_absolute_time();

 

    //判断RunLoop是否被停止

    if (__CFRunLoopIsStopped(rl)) {

        __CFRunLoopUnsetStopped(rl);

    return kCFRunLoopRunStopped;

    } else if (rlm->_stopped) {

    rlm->_stopped = false;

    return kCFRunLoopRunStopped;

    }

 

    /*

    如果当前RunLoop是主线程关联的RunLoop

    dispatchPort被置为GCD主队列的端口号

    */

    mach_port_name_t dispatchPort =   MACH_PORT_NULL;

    Boolean libdispatchQSafe = pthread_main_np()   && ((HANDLE_DISPATCH_ON_BASE_INVOCATION_ONLY   && NULL == previousMode) ||   (!HANDLE_DISPATCH_ON_BASE_INVOCATION_ONLY &&   0 == _CFGetTSD(__CFTSDKeyIsInGCDMainQ)));

    if (libdispatchQSafe && (CFRunLoopGetMain() ==   rl) && CFSetContainsValue(rl->_commonModes,   rlm->_name)) dispatchPort =   _dispatch_get_main_queue_port_4CF();

 

#if USE_DISPATCH_SOURCE_FOR_TIMERS

    mach_port_name_t modeQueuePort =   MACH_PORT_NULL;

    if (rlm->_queue) {

        modeQueuePort =   _dispatch_runloop_root_queue_get_port_4CF(rlm->_queue);

        if (!modeQueuePort) {

            CRASH("Unable to get port for run loop mode queue   (%d)", -1);

        }

    }

#endif

 

    //使用GCD的dispatch_source_t实现RunLoop的超时机制

    dispatch_source_t timeout_timer =   NULL;

    struct __timeout_context *timeout_context =   (struct __timeout_context   *)malloc(sizeof(*timeout_context));

    if (seconds <= 0.0) {   // instant   timeout

        seconds = 0.0;

        timeout_context->termTSR = 0ULL;

    } else if (seconds <= TIMER_INTERVAL_LIMIT)   {

    dispatch_queue_t queue = pthread_main_np() ?   __CFDispatchQueueGetGenericMatchingMain() : __CFDispatchQueueGetGenericBackground();

    timeout_timer =   dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0,   queue);

        dispatch_retain(timeout_timer);

    timeout_context->ds =   timeout_timer;

    timeout_context->rl =   (CFRunLoopRef)CFRetain(rl);

    timeout_context->termTSR = startTSR +   __CFTimeIntervalToTSR(seconds);

    dispatch_set_context(timeout_timer,   timeout_context); //   source gets ownership of context

    dispatch_source_set_event_handler_f(timeout_timer,   __CFRunLoopTimeout);

        dispatch_source_set_cancel_handler_f(timeout_timer,   __CFRunLoopTimeoutCancel);

        uint64_t ns_at =   (uint64_t)((__CFTSRToTimeInterval(startTSR) + seconds) *   1000000000ULL);

        dispatch_source_set_timer(timeout_timer,   dispatch_time(1,   ns_at), DISPATCH_TIME_FOREVER, 1000ULL);

        dispatch_resume(timeout_timer);

    } else {   // infinite   timeout

        seconds = 9999999999.0;

        timeout_context->termTSR =   UINT64_MAX;

    }

 

    Boolean didDispatchPortLastTime =   true;

 

    //do-while循环的判断条件,retVal为0则保持循环

    int32_t retVal = 0;

    do {

#if DEPLOYMENT_TARGET_MACOSX || DEPLOYMENT_TARGET_EMBEDDED ||   DEPLOYMENT_TARGET_EMBEDDED_MINI

        voucher_mach_msg_state_t voucherState =   VOUCHER_MACH_MSG_STATE_UNCHANGED;

        voucher_t voucherCopy =   NULL;

#endif

        uint8_t msg_buffer[3 * 1024];

#if DEPLOYMENT_TARGET_MACOSX || DEPLOYMENT_TARGET_EMBEDDED ||   DEPLOYMENT_TARGET_EMBEDDED_MINI

        mach_msg_header_t *msg =   NULL;

        mach_port_t livePort =   MACH_PORT_NULL;

#elif   DEPLOYMENT_TARGET_WINDOWS

        HANDLE livePort = NULL;

        Boolean windowsMessageReceived =   <code class="java keywor    

   

 

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之IOS频道!

 

本文由 @凌雪 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved