zoukankan      html  css  js  c++  java
  • iOS RunLoop简介

    一、什么是RunLoop?

    RunLoop是运行循环,每个Cocoa应用程序都由一个处于阻塞状态的do/while循环驱动,当有事件发生时,就把事件分派给合适的监听器,如此反复直到循环停止。处理分派的对象就叫做“运行循环”。

    基本作用:1、保持程序的持续运行 2、处理App中的各种事件(比如触摸事件、定时器事件、Selector事件)3、节省CPU资源,提高程序性能:该做事时做事,该休息时休息。

     

    二、RunLoop的基础

    每条线程都有唯一的一个与之对应的RunLoop对象;

    主线程的RunLoop已经自动创建好了,子线程的RunLoop需要主动创建;

    RunLoop在第一次获取时创建,在线程结束时销毁。

    2.1获得RunLoop对象

    1、Foundation

    [NSRunLoop currentRunLoop]; // 获得当前线程的RunLoop对象

    [NSRunLoop mainRunLoop]; // 获得主线程的RunLoop对象

    2、Core Foundation

    CFRunLoopGetCurrent(); // 获得当前线程的RunLoop对象

    CFRunLoopGetMain(); // 获得主线程的RunLoop对象

    2.2 Core Foundation中关于RunLoop的5个类

    CFRunLoopRef、CFRunLoopModeRef、CFRunLoopSourceRef、CFRunLoopTimerRef、CFRunLoopObserverRef

    2.2.1 CFRunLoopModeRef代表RunLoop的运行模式

    一个 RunLoop 包含若干个 Mode,每个Mode又包含若干个Source/Timer/Observer

    每次RunLoop启动时,只能指定其中一个 Mode,这个Mode被称作 CurrentMode

    如果需要切换Mode,只能退出Loop,再重新指定一个Mode进入

    这样做主要是为了分隔开不同组的Source/Timer/Observer,让其互不影响

    系统默认注册了5个Mode;

    kCFRunLoopDefaultMode:App的默认Mode,通常主线程是在这个Mode下运行;

    UITrackingRunLoopMode:界面跟踪 Mode,用于 ScrollView 追踪触摸滑动,保证界面滑动时不受其他 Mode 影响;

    UIInitializationRunLoopMode: 在刚启动 App 时第进入的第一个 Mode,启动完成后就不再使用;

    GSEventReceiveRunLoopMode: 接受系统事件的内部 Mode,通常用不到;

    kCFRunLoopCommonModes: 这是一个占位用的Mode,不是一种真正的Mode;

    CFRunLoopSourceRef是事件源(输入源);

    以前的分法;

    Port-Based Sources;

    Custom Input Sources;

    Cocoa Perform Selector Sources;

    现在的分法;

    Source0:非基于Port的;

    Source1:基于Port的;

    CFRunLoopTimerRef是基于时间的触发器;

    基本上说的就是NSTimer;

    CFRunLoopObserverRef是观察者,能够监听RunLoop的状态改变;

    可以监听的时间点有以下几个

       

    三、RunLoop处理逻辑

  • 相关阅读:
    bzoj2733 永无乡 平衡树按秩合并
    bzoj2752 高速公路 线段树
    bzoj1052 覆盖问题 二分答案 dfs
    bzoj1584 打扫卫生 dp
    bzoj1854 游戏 二分图
    bzoj3316 JC loves Mkk 二分答案 单调队列
    bzoj3643 Phi的反函数 数学 搜索
    有一种恐怖,叫大爆搜
    BZOJ3566 概率充电器 概率dp
    一些奇奇怪怪的过题思路
  • 原文地址:https://www.cnblogs.com/fengmin/p/5612974.html
Copyright © 2011-2022 走看看