iOS夯实:RunLoop

目标:用简洁易懂的语言归纳runLoop和对我们日常开发的影响。

1. 什么是RunLoop

runLoop是一个与线程相关的机制,可以简单理解为一个循环。 在这个循环里面等待事件,然后处理事件。而这个循环是基于线程的。 在Cocoa中每个线程都有它的runLoop. 通过runLoop这样的机制,线程能够在没有事件需要处理的时候休息,有事情的时候运行。减轻CPU压力。

2. 日常开发中的RunLoop

简单理解了RunLoop之后,我们发现其实我们平时的开发,背后都无时无刻与runLoop有关。

但是我们很幸运不需要把时间都浪费在纠结这些底层细节上,绝大部分工作都交给了操作系统为我们实现。 所以关于runLoop,我们在不想被底层细节包围的前提下,需要了解和做些什么呢。

    1. 需要了解RunLoop的坑:

      • NSTimer
        日常开发中,我们与runLoop接触得最近可能就是通过NSTimer了。一个Timer一次只能加入到一个RunLoop中。我们日常使用的时候,通常就是加入到当前的runLoop的default mode中。

        提到mode,就需要谈谈RunLoop Modes
        简单的说,runLoop有多个Mode,RunLoop只能运行一个Mode,runLoop只会处理它当前Mode的事件。

        所以就会导致一些地方我们需要去注意。

        • 一般Timer是运行在RunLoop的default mode上,而ScrollView在用户滑动时,主线程RunLoop会转到UITrackingRunLoopMode。而这个时候,Timer就不会运行,方法得不到fire。

        用一个真实例子来说明(自身教训):

        在一次写一个注册界面的时候,用户点击发送验证码后,使用Timer,倒数60秒以允许用户再次申请发送验证码,同时每一秒更新界面秒数信息。而此时Timer运行于主线程的default mode上。若此时用户滑动显示屏,则会出现Timer失效,界面得不到更新的情况。此时就是因为RunLoop的mode原因。

      • NSURLConnection,NSStream也是同样的情况,默认运行于default mode。
    2. 解决方案:
      • 第一种:设置RunLoop Mode,例如NSTimer,我们指定它运行于NSRunLoopCommonModes,这是一个Mode的集合。注册到这个Mode下后,无论当前runLoop运行哪个mode,事件都能得到执行。
      • 第二种:另一种解决Timer的方法是,我们在另外一个线程执行和处理Timer事件,然后在主线程更新UI.
时间: 2024-10-03 20:25:03

iOS夯实:RunLoop的相关文章

iOS夯实:内存管理

iOS夯实:内存管理 文章转自 内存管理 最近的学习计划是将iOS的机制原理好好重新打磨学习一下,总结和加入自己的思考. 有不正确的地方,多多指正. 目录: 基本信息 旧时代的细节 新时代 基本信息 Objective-C 提供了两种内存管理方式. MRR (manual retain-release) 手动内存管理这是基于reference counting实现的,由NSObject与runtime environment共同工作实现. ARC (Automatic Reference Cou

iOS中RunLoop机制浅探

iOS中RunLoop机制浅探 一.浅识RunLoop RunLoop这个家伙在iOS开发中,我们一直在用,却从未注意过他,甚至都不从见过他的面孔,那个这个神秘的家伙究竟是做什么的?首先,我们先来观察一下我们的程序运行机制. 无论是面向对象的语言或是面向过程的语言,代码的执行终究是面向过程的.线程也一样,一个线程从开始代码执行,到结束代码销毁.就像HELLO WORLD程序,打印出字符串后程序就结束了,那么,我们的app是如何实现如下这样的机制的呢:app从运行开始一直处于待命状态,接收到类似点

iOS开发RunLoop学习:四:RunLoop的应用和RunLoop的面试题

一:RunLoop的应用 #import "ViewController.h" @interface ViewController () /** 注释 */ @property (nonatomic, strong) NSThread *thread; @end @implementation ViewController /** * 1:用NSThread创建线程的时候,不要忘记调用start方法来开启线程,在一条线程中的任务执行的顺序是同步的,串行执行,并且当线程中的任务执行完毕后

iOS多线程 && Runloop

一.线程概述 有些程序是一条直线,起点到终点:有些程序是一个圆,不断循环,直到将它切断.直线的如简单的Hello World,运行打印完,它的生命周期便结束了,像昙花一现那样:圆如操作系统,一直运行直到你关机.  一个运行着的程序就是一个进程或者叫做一个任务,一个进程至少包含一个线程,线程就是程序的执行流.Mac和iOS中的程序启动,创建好一个进程的同时, 一个线程便开始运行,这个线程叫主线程.主线程在程序中的地位和其他线程不同,它是其他线程最终的父线程,且所有界面的显示操作即AppKit或 U

iOS 中RunLoop 原理与核心机制

目录[-] RunLoop的定义 目的 理解 特性 RunLoop机制 RunLoop 运行时调用栈 RunLoop支持的消息事件(Events) Run Loop Modes Run Loop应用实践 RunLoop的定义 当有持续的异步任务需求时,我们会创建一个独立的生命周期可控的线程.RunLoop就是控制线程生命周期并接收事件进行处理的机制. RunLoop是iOS事件响应与任务处理最核心的机制,它贯穿iOS整个系统. Foundation: NSRunLoopCore Foundati

iOS开发-RunLoop总结

序言 在<iOS之应用程序启动过程及原理总结>一篇中介绍了iOS应用的启动原理.我们知道当应用启动后,系统会自动创建一个线程来执行任务,该线程被称为主线程或者UI线程.其实在主线程创建的时候,系统还会为主线程创建并启动一种机制(其实就是一个对象,该对象和应用的生命周期有关),叫做RunLoop,被称为运行循环机制.本文主要将介绍iOS应用中的RunLoop机制. RunLoop简介 RunLoop概念 提到RunLoop,我们一般都会提到线程,这是为什么呢?先来看下 官方对 RunLoop 的

iOS开发RunLoop学习:一:RunLoop简单介绍

一:RunLoop的简单介绍 #import "ViewController.h" @interface ViewController () @end @implementation ViewController /** * 1:Runloop和线程的关系:1:一一对应,主线程的runloop已经默认创建,但是子线程的需要手动创建:创建子线程的runloop: NSRunLoop *run = [NSRunLoop currentRunLoop];currentRunLoop懒加载的,

iOS 的 Runloop

runloop 主线程  的 Runloop对象 会自动开启, UIApplication开启了一个死循环(消息循环) 每一个线程都有自己的 runloop 对象  runloop 1.> 输入源 input resource: (异步消息->处理其他线程)处理处理其他线程回到主线程做事情 performSelector: onThread (线程之间通信) 2.> 定时源  timer resource :(同步消息->处理主线程) 处理主线程的UI界面刷新,事件处理,定时器(定

iOS开发RunLoop学习:三:Runloop相关类(source和Observer)

一:RunLoop相关类: 其中:source0指的是非基于端口por,说白了也就是处理触摸事件,selector事件,source1指的是基于端口的port:是处理系统的一些事件 注意:创建一个RunLoop之后,有默认的运行模式mode,也可以为RunLoop指定运行模式,RunLoop启动必须得有运行模式,而且在运行模式中必须还有timer或是source事件其中之一,否则RunLoop就会退出.启动RunLoop必须调用start方法 二:RunLoop运行处理逻辑 RunLoop通知观