iOS中的消息循环

什么是消息循环:

消息循环就是NSRunloop这个类 ,每个线程都有自己的消息循环。

主线程的消息循环默认是开启的(需要去检测事件),子线程默认关闭(通常不需要子线程检测事件)。

消息循环的目的:

保证程序不退出、负责处理输入事件(输入源和Timer源)、如果没有事件发生则会让程序处于休眠状态。

消息循环的两种运行模式:NSDefaultRunloopModel和 NSRunloopCommonModels

消息循环需要在一定的模式下才能相匹配,当在消息循环中添加了一个定时源时, 消息循环的模式必须和定时源的模式相匹配才能执行:

在主线程中:

NSTimer *timer=  [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(TextDemo) userInfo:nil repeats:YES];
      [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];

/*当时用当前模式NSDefaultRunLoopMode时,当在UI上触发可见事件时,模式就发生了改变则定时源中的方法不运行了

将模式改为NSRunloopCommonModels时,定时源中的方法正常执行, 因为该模式下包含了两个底层的模式。

*/

在子线程中需要开启消息循环的方法:

//直接开启消息循环

[[NSRunLoop currentRunLoop] run];

//开启到什么时间
    [[NSRunLoop currentRunLoop]runUntilDate:[NSDate dateWithTimeIntervalSinceNow:2.0]];

时间: 2024-11-16 22:55:17

iOS中的消息循环的相关文章

IOS中Block的循环引用

@interface DemoObj() @property (nonatomic, strong) NSOperationQueue *queue; @end @implementation DemoObj - (instancetype)init { self = [super init]; if (self) { self.queue = [[NSOperationQueue alloc] init]; } return self; } - (void)dealloc { NSLog(@"

TMsgThread, TCommThread -- 在delphi线程中实现消息循环(105篇博客,好多研究消息的文章)

在delphi线程中实现消息循环 在delphi线程中实现消息循环 Delphi的TThread类使用很方便,但是有时候我们需要在线程类中使用消息循环,delphi没有提供. 花了两天的事件研究了一下win32的消息系统,写了一个线程内消息循环的测试. 但是没有具体应用过,贴出来给有这方面需求的DFW参考一下.希望大家和我讨论. {----------------------------------------------------------------------------- Unit

在delphi线程中实现消息循环

http://delphi.cjcsoft.net//viewthread.php?tid=635 在delphi线程中实现消息循环 Delphi的TThread类使用很方便,但是有时候我们需要在线程类中使用消息循环,delphi没有提供. 花了两天的事件研究了一下win32的消息系统,写了一个线程内消息循环的测试. 但是没有具体应用过,贴出来给有这方面需求的DFW参考一下.希望大家和我讨论. {--------------------------------------------------

安卓中的消息循环机制Handler及Looper详解

我们知道安卓中的UI线程不是线程安全的,我们不能在UI线程中进行耗时操作,通常我们的做法是开启一个子线程在子线程中处理耗时操作,但是安卓规定不允许在子线程中进行UI的更新操作,通常我们会通过Handler机制来完成该功能,即当子线程中耗时操作完成后,在子线程中通过Handler向主线程发送消息,在主线程中的Handler的handleMessage方法中处理接受到的消息.这就是安卓中的消息机制,安卓中的消息机制主要是指Handler的运行机制,但是Handler的运行需要底层的MessageQu

Windows 消息循环(2) - WPF中的消息循环

接上文: Windows 消息循环(1) - 概览 win32/MFC/WinForm/WPF 都依靠消息循环驱动,让程序跑起来. 本文介绍 WPF 中是如何使用消息循环来驱动程序的. 4 消息循环在 WPF 中的应用 4.1 引入 只听说过 Dispatcher ,哪里来的消息循环? 先瞧一眼 WPF 启动运行堆栈: 可以发现 PushFrameImpl 这个方法. 去看其源码,就发现了熟悉的消息循环 : 可以理解为:Dispatcher 对消息循环的操作进行了"封装" . 那,Di

IOS中的block 循环引用和retain cycle (经典)

retain cycle 的产生 说到retain cycle,首先要提一下Objective-C的内存管理机制. 作为C语言的超集,Objective-C延续了C语言中手动管理内存的方式,但是区别于C++的极其非人道的内存管理,Objective-C提出了一些机制来减少内存管理的难度. 比如:内存计数. 在Objective-C中,凡是继承自NSObject的类都提供了两种方法,retain和release.当我们调用一个对象的retain时,这个对象的内存计数加1,反之,当我们调用relea

IOS - RunLoop消息循环

什么是RunLoop? -RunLoop就是消息循环,每一个线程内部都有一个消息循环. -只有主线程的消息循环默认开启,子线程的消息循环默认不开启. RunLoop的目的 -保证程序不退出 . -负责处理输入事件.  -如果没有事件发生,会让程序进入休眠状态  . 事件类型 Input Sources (输入源) & Timer Sources (定时源) -输入源可以是键盘鼠标,NSPort, NSConnection 等对象,定时源是NSTimer 事件 添加消息到循环中 -创建输入源.(以

深入探讨MFC消息循环和消息泵

首先,应该清楚MFC的消息循环(::GetMessage,::PeekMessage),消息泵(CWinThread::PumpMessage)和MFC的消息在窗口之间的路由是两件不同的事情.在MFC的应用程序中(应用程序类基于CWinThread继承),必须要有一个消息循环,他的作用是从应用程序的消息队列中读取消息,并把它派送出去(::DispatchMessage).而消息路由是指消息派送出去之后,系统(USER32.DLL)把消息投递到哪个窗口,以及以后消息在窗口之间的传递是怎样的.  消

Android消息循环分析

我们的经常使用的系统中.程序的工作一般是有事件驱动和消息驱动两种方式,在Android系统中,Java应用程序是靠消息驱动来工作的. 消息驱动的原理就是: 1. 有一个消息队列.能够往这个队列中投递消息; 2. 有一个消息循环.不断从消息队列中取出消息.然后进行处理. 在Android中通过Looper来封装消息循环.同一时候在当中封装了一个消息队列MessageQueue. 另外Android给我们提供了一个封装类.来运行消息的投递,消息的处理.即Handler. <!--more--> 在