IOS - RunLoop消息循环

什么是RunLoop?

  -RunLoop就是消息循环,每一个线程内部都有一个消息循环。

  -只有主线程的消息循环默认开启,子线程的消息循环默认不开启。

RunLoop的目的

  -保证程序不退出 。

  -负责处理输入事件。

   -如果没有事件发生,会让程序进入休眠状态  。

事件类型

Input Sources (输入源) & Timer Sources (定时源)

  -输入源可以是键盘鼠标,NSPort, NSConnection 等对象,定时源是NSTimer 事件

    

添加消息到循环中

  -创建输入源。(以NSTimer为例)

  -指定该事件(源)在循环中运行的模式,并加入循环。

[self performSelector:@selector(demo2) onThread:thread withObject:nil waitUntilDone:NO];

[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];

         

循环常用模式

  NSDefaultRunLoopMode--默认模式

  NSRunLoopCommonModes--普通模式

  

    //1.NSTimer定时源
    NSTimer *timer = [NSTimer timerWithTimeInterval:1 target:self selector:@selector(demo) userInfo:nil repeats:YES];
    //2.把定时源加入到当前线程的消息循环中
    /*
     1.定时源
     2.模式
     NSDefaultRunLoopMode 触摸界面->timer停止->手放开->timer运行
     NSRunLoopCommonModes 触摸界面不受影响
     触摸界面kCFRunLoopDefaultMode->UITrackingRunLoopMode->手放开->kCFRunLoopDefaultMode
     */
    [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
    //3.当消息循环的模式和消息的模式相匹配,消息才能运行

总结

1.创建消息

2.把消息放入循环,并指定消息运行的模式

3.在与循环的模式匹配的时候,消息运行

子线程中的消息循环

 //子线程的消息循环
    NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(demo) object:nil];
    [thread start];
    //输入源
    /*
     1.方法
     2.线程
     3.参数
     4.是否等待方法的完成
     */
    //创建输入源,加入到子线程的消息循环
    //只有主线程的消息循环默认开启,子线程的消息循环默认不开启。->手动开启子线程的消息循环
    [self performSelector:@selector(talk) onThread:thread withObject:nil waitUntilDone:NO];
-(void)demo{
    NSLog(@"demo is running");
//    NSLog(@"%@",[NSRunLoop currentRunLoop].currentMode);
    //手动开启子线程的消息循环
    //1.run方法开了关不了OC
    [[NSRunLoop currentRunLoop] run];

    //2.指定时间->不靠谱 不确定方法具体执行的时长等等因素
//    [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:1]];

    //3.apple推荐(了解)
//    BOOL shouldKeepRunning = YES;        // global
//    NSRunLoop *theRL = [NSRunLoop currentRunLoop];
//    while (shouldKeepRunning && [theRL runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]);
    NSLog(@"ok");
时间: 2025-01-02 17:30:27

IOS - RunLoop消息循环的相关文章

iOS消息循环-模式匹配

以下内容均来自互联网,但属于个人摘录总结,主要分析一下“只有当消息循环的模式与事件模式匹配时,消息循环才会运行”这句话的模式匹配,是哪些模式匹配哪些模式. 每个线程都有一个消息循环,主线程消息循环默认开启,子线程消息循环默认都是关闭的,需要手动开启.消息循环与线程之间是一一对应的关系,其关系保存在一个全局字典里面(字典的key为线程,value为消息循环). 你只能在线程结束时销毁消息循环.除了主线程即UI线程,你只能在线程内部获取消息循环. 为消息循环添加事件,事件有两种类型: 输入源:异步传

iOS中的消息循环

什么是消息循环: 消息循环就是NSRunloop这个类 ,每个线程都有自己的消息循环. 主线程的消息循环默认是开启的(需要去检测事件),子线程默认关闭(通常不需要子线程检测事件). 消息循环的目的: 保证程序不退出.负责处理输入事件(输入源和Timer源).如果没有事件发生则会让程序处于休眠状态. 消息循环的两种运行模式:NSDefaultRunloopModel和 NSRunloopCommonModels 消息循环需要在一定的模式下才能相匹配,当在消息循环中添加了一个定时源时, 消息循环的模

Runloop(运行循环)是什么?

运行循环是什么?从介绍到演示 今天整理一下运行循环来帮朋友们了解一下什么是运行循环,也叫消息循环,建议大家称之为运行循环(Runloop). 关于多线程的运行循环(消息循环) 1. 什么是运行循环 (1)Runloop就是运行循环,每个线程内部都有一个运行循环. (2)只有主线程的运行循环默认是开启的,子线程的运行循环. 2. 运行循环的作用 (1)保证程序不退出,iOS的应用程序启动之后,之所以不会退出,就是因为有Runloop(运行循环).运行循环是一个死循环,只有满足一定条件才会结束循环.

Android Handler 消息循环机制

前言 一问起Android应用程序的入口,很多人会说是Activity中的onCreate方法,也有人说是ActivityThread中的静态main方法.因为Java虚拟机在运行的时候会自动加载指定类的静态共有main方法,因此个人更倾向于第二种说法. public final class ActivityThread { ......  public static void main(String[] args) {  ......  Looper.prepareMainLooper(); 

ios Runloop

一.概念:一个Runloop就是一个事件处理的循环,用来不停的调度工作和处理输入事件,使用runloop的目的是让你的线程在有工作的时候处于工作状态,没有工作的时候处于休眠状态. 一般来讲,一个线程一次只能执行一个任务,执行完成后线程就会退出.如果我们需要一个机制,让线程能随时处理事件但并不退出,通常的代码逻辑是这样的: 1 2 3 4 5 6 7 function loop() {     initialize();     do {         var message = get_nex

iOS Runloop理解

一.RunLoop的定义 当有持续的异步任务需求时,我们会创建一个独立的生命周期可控的线程.RunLoop就是控制线程生命周期并接收事件进行处理的机制. RunLoop是iOS事件响应与任务处理最核心的机制,它贯穿iOS整个系统. Foundation: NSRunLoopCore Foundation: CFRunLoop 核心部分,代码开源,C 语言编写,跨平台 二.目的 通过RunLoop机制实现省电,流畅,响应速度快,用户体验好 三.理解 进程是一家工厂,线程是一个流水线,Run Loo

iOS开发-消息初认识

一.消息循环(runLoop)的作用 1,防止程序退出, 2,接受事件 3,如果没有事件,让程序自动休眠 二.消息源 1, 输入源:键盘.鼠标.NSBoard.NSPort 2,定时源:NSTimer 三.创建消息的步骤: 1, 创建消息 2,方法循环中,并指定消息的模式 3,消息模式和循环模式要匹配,否则不能运行 注意:主线程默认是开启消息循环,子线程默认是关闭消息循环的 四.手动开启消息循环的方式 方式一 :run方法,缺点:开了无法关闭 方式二 :runUntildata 给定一个时间,让

Unity3D研究院之IOS本地消息通知LocalNotification的使用

原地址:http://www.xuanyusong.com/archives/2632   现在的游戏里一般都会有本地消息,比如每天定时12点或者下午6点告诉玩家进入游戏领取体力.这种东西没必要服务器去推送,客户端就可以完成.Unity里面提供了本地任务的功能但是只有IOS上才支持,开始我有点不解为什么Android上不支持,当我把Android的本地通知做完后,我才明白.IOS源生的API中就支持固定时间循环推送,而Android上需要自己开启一个Services,启动一个AlarmManag

Chromium on Android: Android系统上Chromium主消息循环的实现分析

摘要:刚一开始接触Chromium on Android时,就很好奇Chromium的主消息循环是怎么整合到Android应用程序中的.对于Android程序来说,一旦启动,主线程就会有一个Java层的消息循环处理用户输入事件等系统事件,而对Chromium来说,它有自己另一套消息循环的实现,这个实现有哪些特点,又将如何无缝整合到Android Java层的消息循环中去,正是本文所要讨论的话题. 原创文章系列,转载请注明原始出处为http://blog.csdn.net/hongbomin/ar