runloop

【iOS】RunLoop Mode到底包含哪些类型的元素?前面提到过:存储所有commonMode的itemsourcetimerobserver上面的SourceTimerObserver被统称为mode item所有的mode item都可以被添加到Mode中,Mode中可以包含多个mode item,一个item也可以被加入多个mode。但一个item被重复加入同一个mode时是不会有效果的。如果一个mode中一个item都没有,则RunLoop会退出,不进入循环。 阅读详情
现在说说runloop为何会成为cocoa开发中迷惑的点。因为很多新手没有从动态角度看它。 首先回想一下第2点介绍的runtime的概念。 接着我出一个题思考一下。 
 
现在我有一个程序片段如下: 
复制代码
  1. - (void)myThread:(id)sender
  2. {
  3.     NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init];
  4.     while (TRUE) {
  5.         
  6.         //do some jobs
  7.        //break in some condition
  8.         
  9.         usleep(10000);
  10.         
  11.         [pool drain];
  12.     }
  13.     
  14.     [pool release];
  15. }
 
现在要求,做某些设计,使得当这个线程运行的同时,还可以从其它线程里往它里面随意增加或去掉不同的计算任务。 这,就是NSRunloop的最原始的开发初衷。让一个线程的计算任务更加灵活。 这个功能在c, c++里也许可以做到但是非常难,最主要的是因为语言能力的限制,以前的程序员很少这么去思考。 
 
好,现在我们对上面代码做一个非常简单的进化: 
 
复制代码
  1. NSMutableArray *targetQueue;
  2. NSMutableArray *actionQueue;

  3. - (void)myThread:(id)sender
  4. {
  5.     NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init];
  6.     while (TRUE) {
  7.         
  8.         //do some jobs
  9.         //break in some condition
  10.         int n=[targetQueue count];
  11.         assert(n==[actionQueue count]);
  12.         for(int i=0;i<n;i++){
  13.             id target=[targetQueue objectAtIndex:i];
  14.             SEL action=NSSelectorFromString([actionQueue objectAtIndex:i]);
  15.             if ([target respondsToSelector:action]) {
  16.                 [target performSelector:action withObject:nil];
  17.             }
  18.         }
  19.                 
  20.         usleep(10000);
  21.         
  22.         [pool drain];
  23.     }
  24.     
  25.     [pool release];
  26. }
 
注意,这里没有做线程安全处理,记住Mutable container is not thread safe. 
这个简单的扩展,让我们看到了如何利用runtime能力让线程灵活起来。当我们从另外线程向targetQueue和actionQueue同时加入对象和方法时候,这个线程函数就有了执行一个额外代码的能力。 
 
但,有人会问,哪里有runloop? 那个是 nsrunloop? 看不出来啊。 
复制代码
  1. while (TRUE) {
  2. //break in some condition
  3. }
 
一个线程内这个结构就叫线程的runloop,   它和NSRunloop这个类虽然名字很像,但完全不是一个东西。以前在使用静态语言开始时候,程序员没有什么迷惑,因为没有NSRunloop这个东西。 我接着来说,这个NSRunloop是如何来得。 
 
第二段扩展代码里面确实没有NSRunloop这个玩意儿,我们接着做第3次改进。 这次我们的目的是把其中动态部分抽象出来。 
 
复制代码

  1. @interface MyNSTimer : NSObject
  2. {
  3.   id target;
  4.   SEL action;
  5.   float interval;
  6.   CFAbsoluteTime lasttime;
  7. }
  8. - (void)invoke;
  9. @end

  10. @implementation MyNSTimer
  11. - (void)invoke;
  12. {
  13.   if ([target respondsToSelector:action]) {
  14.         [target performSelector:action withObject:nil];
  15.     }
  16. }
  17. @end
 
 
 
复制代码
  1. @interface MyNSRunloop : NSObject
  2. {
  3.   NSMutableArray *timerQueue;
  4. }
  5. - (void)addTimer:(MyNSTimer*)t;
  6. - (void)executeOnce;
  7. @end

  8. @implementation MyNSRunloop
  9. - (void)addTimer:(MyNSTimer*)t;
  10. {
  11.   @synchronized(timerQueue){
  12.       [timerQueue addObject:t];
  13.     }
  14. }
  15. - (void)executeOnce;
  16. {
  17.   CFAbsoluteTime currentTime=CFAbsoluteTimeGetCurrent();
  18.   @synchronized(timerQueue){
  19.       for(MyNSTimer *t in timerQueue){
  20.           if(currentTime-t.lasttime>t.interval){
  21.               t.lasttime=currentTime;
  22.                   [t invoke];
  23.           }
  24.       }
  25.   }
  26. }
  27. @end
 
 
复制代码
  1. @interface MyNSThread : NSObject
  2. {
  3.   MyNSRunloop *runloop;
  4. }
  5. - (void)main:(id)sender;
  6. @end

  7. @implementation MyNSThread
  8. - (void)main:(id)sender
  9. {
  10.     NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init];
  11.     while (TRUE) {
  12.         //do some jobs
  13.         //break in some condition
  14.         [runloop executeOnce];
  15.         usleep(10000);
  16.         [pool drain];
  17.     }
  18.     [pool release];
  19. }
  20. @end
 
 
走到这里,我们就算是基本把Runloop结构抽象出来了。例如我有一个MyNSThread实例,myThread1。我可以给这个实例的线程添加需要的任务,而myThread1内部的MyNSRunloop对象会管理好这些任务。 
 
复制代码
  1. MyNSTimer *timer1=[MyNSTimer scheduledTimerWithTimeInterval:1
  2.                                                    target:obj1
  3.                                                  selector:@selector(download1:)];
  4. [myThread1.runloop addTimer:timer1];

  5. MyNSTimer *timer2=[MyNSTimer scheduledTimerWithTimeInterval:2
  6.                                                    target:obj2
  7.                                                  selector:@selector(download2:)];
  8. [myThread1.runloop addTimer:timer2];
 
 
当你看懂了上面的代码也许会感叹,‘原来是这么回事啊!为什么把这么简单的功能搞这么复杂呢?’ 其实就是这么回事,把Runloop抽象出来可以使得线程任务管理更加loose coupling,给设计模式提供更大的空间。这样第三方开发者不需要过深入的涉及线程内部代码而轻松管理线程任务。另外请注意,这里MyNSRunloop, MyNSTimer等类是我写得一个模拟情况,真实的NSRunloop实现肯定不是这么简单。这里只为了说明一个思想。这种思想贯穿整个cocoa framework从界面更新到event管理。
iOS RunLoop的总结 RunLoop是iOS开发核心的事件循环机制,它负责管理线程的生命周期、处理各类事件。主线程的RunLoop默认开启,子线程需要手动获取并维护RunLoop。以上就是对RunLoop的一些总结。 阅读详情

相关推荐

iOS进阶教程2-RUNLOOP优化大图加载

1 为什么要优化大图加载 大图片在渲染的时候,比较耗费时间 我们利用RUNLOOP 来优化: 思路:1.每一次RUNLOOP,都只加载一个小任物,把图片任务放到数组,从数组循环来加载.这样可以是项目达到流畅. 2.只加载当前视图内的图片任务 3.为了不让runloop休眠.我们要用一个timer区持有这个runloop 或者 通知注册runloop事件,让快要睡眠...

Coder Bruce 1620

RunLoop的一些理解

1.Runloop与dispatch的关系 1.在__CFRunLoopRun函数中,用dispatch_source_create创建一个定时器。处理此次runLoop mode的运行时间,唤醒Runloop 2.使用dispatch的任务,例如 dispatch_async 提交的任务 dispatch_after 提交的延时任务 dispatch_source_create dispatch_source_set_timer dispatch_source_set_event_handler 设置的

勿在浮沙筑高楼 1209

Android音频子系统分析-car_audio_configuration.xml

先附上一个例子,再逐一解释。概括来说,该文件描述了车里有哪些区域,每个区域划分了多少组,每个组包含了哪些设备,每个设备接收哪些类型的音频流。

不定时记录分享一些有用没用的东西 989

【iOS】—— RunLoop详解

一般来说,一个线程一次只能执行一个任务,执行完成后线程就会退出。就比如之前学OC时使用的命令行程序,执行完程序就结束了。而runloop目的就是使线程在执行完一次代码之后不会结束程序,而是使该线程处于一种休眠的状态,等待有事件需要处理的时候,再醒来处理。简单的来说,runloop可以让线程在需要做事的时候忙起来,不需要的时候让线程休眠,使程序不会结束。RunLoop需要处理的消息,包括time以及source消息,他们都属于Mode item。......

m0_55124878的博客 3521

Ubuntu开机卡在BusyBox?3种方法快速修复initramfs错误(附详细命令)

本文详细介绍了Ubuntu开机卡在BusyBox并出现initramfs错误的3种修复方法,包括使用fsck检查文件系统、调整BIOS/UEFI存储设置以及修改GRUB内核参数。针对常见的文件系统错误和根设备无法找到问题,提供了具体的命令行操作步骤和实用技巧,帮助用户快速恢复系统启动。

milk8的博客 785

虚拟机器人平台CoppeliaSim(Vrep)的逆运动学教学

相信看这篇博客的人都知道CoppeliaSim是做什么的,因此这里不多赘述。CoppeliaSim从最早的Vrep到现在已经更新了N个版本,从过去Vrep3.x开始使用的我这里小小地吐槽一下这个软件。CoppeliaSim每一个版本都有更新,问题是这些更新有时候不能向前兼容,而且时不时更新地让人不知所措(对于有紧急任务的时候真的很火大啊)。 以本文所展示地逆运动学来说,CoppeliaSim在4.0.0之后又大变,推翻了过往所有的拖动模块链接之类的构建方式,转而采用直接通过代码来实现逆运动学。 简单版逆运动

qq_39243015的博客 6699

【iOS】——RunLoop学习

一个线程一次只能执行一个任务,执行完毕后就会退出。do {//获取消息//处理消息} while (消息!= 退出)这种模型通常被称为Event Loop,Event loop 在很多系统和框架都有实现。例如:Node.js 的事件处理,Windows 程序的消息循环,而在macOS、iOS中就是Run Loop。简单的说RunLoop其实就是一种循环,通过这种循环得以让应用程序持续运行,让线程能随时处理事件,并在线程需要进行事件处理时忙起来,在不需要进行事件处理时闲下来。

m0_73974920的博客 2763

问题解答:如何不通过修改底层数据库表的方式,给数据库对应的数据结构,增添新的字段?

现在需要将这张表里的内容读取到 ABAP 内表里,并且针对每个行项目,增加一个新的列字段,我随便举个例子,这个列字段名称叫 LENGTH,值为 OBJ_NAME 字段的长度,使用。最笨的办法就是下面这样定义一个新的类型,这个类型的每个字段名称,都来自数据库表 TADIR 的同名字段,在末尾再增添自定义字段 length.其实我们是做 ALV 输出,只需要 ABAP 内表变量的类型,包含 TADIR 数据库表的全部字段,再加上新的 LENGTH 字段即可。这相当于多了一个中间层,没办法直接被 ALV 处理。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 482

iOS——runLoop

RunLoop实际上就是一个对象,这个对象管理了其需要处理的事件和消息,并提供了一个入口函数来执行相应的处理逻辑。线程执行了这个函数后,就会处于这个函数内部的循环中,直到循环结束,函数返回。RunLoop是一种高级的循环机制,让程序持续运行,并处理程序中的各种事件,让线程在需要做事的时候忙起来,不需要的话就让线程休眠。RunLoop和线程是绑定在一起的,每条线程都有唯一一个与之对应的RunLoop对象。不能自己创建RunLoop对象,但是可以获取系统提供的RunLoop对象。

m0_73348697的博客 2737

安装anaconda3时出现错误:Failed to link extracted packages to D:\anaconda!...如何解决?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 1482

【AIZ智能体】Codex 全能AI助手从部署到使用实战操作详解

Codex 全能AI助手从部署到使用实战操作详解

congge 2987

iOS Runloop探索(快速了解Runloop)

Runloop是一个事件处理循环,用于调度工作并协调接收传入事件。Runloop 的目的是在有工作要做的时候让线程保持忙碌,在没有工作的时候让线程休眠。本篇文章就对Runloop进行一个简单的阐述,希望能帮到需要了解的同仁。

郭永明的技术专栏 4073

2024顶级提示工程工具:提升效率的12个神器

LlamaIndex虽然本身不是直接的提示词编辑工具,但其整个设计都围绕着如何有效地将外部知识融入LLM的提示词。它提供了结构化的方式来管理“上下文窗口”——即哪些私有数据应该被包含在提示词中。通过优化索引结构和检索策略,可以确保提示词中包含最相关、最高质量的上下文信息,从而大幅提升LLM基于私有数据回答问题的准确性和相关性。同时,LlamaIndex允许开发者针对不同的查询类型和数据特点定制提示词模板,这使得提示词的复用和优化更加系统化。

AIGC应用创新大全的博客 1099

【iOS】Runloop

先前学习了Runtime的内容,现在来学习一下Runloop本文介绍玩Runloop,应该懂得:Runloop事件上就是一个事件循环,也可以当作一个对象,这个对象实际上就是用来处理消息与事件的,其提供了一个入口函数去执行EventLoop同时Runloop中又包含五种Mode,其中最常用的是,Mode中又有ModeItems的集合,如果一个Mode中没有items,那么runloop就会退出,items是指。

weixin_72437555的博客 1246

智能测试策略优化:平衡覆盖率、时间和资源

在软件开发过程中,测试是确保软件质量的关键环节。然而,测试工作往往面临着诸多挑战,其中如何在保证测试覆盖率的前提下,合理分配时间和资源是一个核心问题。本文章的目的在于探讨智能测试策略的优化方法,帮助软件测试团队在有限的时间和资源条件下,实现尽可能高的测试覆盖率。文章的范围涵盖了智能测试策略的核心概念、算法原理、数学模型、实际应用案例以及相关工具和资源等方面。本文将按照以下结构进行组织:首先介绍智能测试策略优化的背景和相关概念,包括核心术语和缩略词的定义;

AIGC应用创新大全的博客 620

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Runloop解析

​ RunLoop——运行循环(死循环),它提供了一个事件循环机制在程序运行过程中处理各种事件,例如用户交互、网络请求、定时器等等。RunLoop可以在需要的时候自己跑起来运行,在没有操作的时候就停下来休息,充分节省CPU资源,提高程序性能。

yueliangmua的博客 1435

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

RunLoop源码详解

文章目录RunLoop是什么NSRunLoop和CFRunLoopRunLoop内部结构RunLoop源码__CFRunLoop结构体__CFRunLoopMode结构体__CFRunLoopSource结构体CFRunLoopSourceContextCFRunLoopSourceContext1__CFRunLoopTimer结构体__CFRunLoopObserver结构体 RunLoop是什么 如果没有RunLoop,那么该线程在执行完自己的任务时就会退出;而我们在使用APP时,通常不会只执行完一个

吃橘子 980

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

RunLoop源码剖析---图解RunLoop

文章目录RunLoop源码剖析---图解RunLoop前言什么是RunLoop?RunLoop的作用RunLoop在何处开启?RunLoop对象RunLoop对象的获取CFRunLoopRef对象源码剖析RunLoop和线程RunLoop的相关类RunLoop的相关类之间关系各个类的作用RunLoop中的ModeCFRunLoopModeRef__CFRunLoopMode源码剖析__CFRunL...

qq_42376419的博客 1533

【iOS】RunLoop学习

这篇博客起源于一个问题,为什么自动轮播图在滑动tableView时就停止滚动了。以上就是我学习RunLoop的总结,后续我讲继续补充完善我的博客。

2401_87841908的博客 401

第9章:RunLoop面试问题

一、概念      1、什么是RunLoop? RunLoop是通过内部维护的事件循环来对事件/消息进行管理的一个对象。      2、什么是事件循环? 没有消息需要处理时,休眠以避免资源占用,此时当前线程的控制权由用户态切换到内核态;有消息需要处理时,立即被唤醒,此时状态由内核态切换到用户态。      3、应用程序的main函数为什么能一直运行不退出? 因为main函数中调用了UI...

BlackWolfSky的博客 589

RunLoop

#概念 RunLoop是事件接收和分发机制的一个实现,是线程相关的基础框架的一部分,一个RunLoop就是一个事件处理的循环,用来不停的调度工作以及处理输入事件。 RunLoop本质是一个do-while循环,没事做就休息,来活了就干活。与普通的while循环是有区别的,普通的while循环会导致CPU进入忙等待状态,即一直消耗cpu,而RunLoop则不会,RunLoop是一种闲等待,即RunLoop具备休眠功能。 #####RunLoop的作用 保持程序的持续运行 处理APP中的各种事件(触摸、定时器

shuiyue184480的博客 2128

[iOS]-RunLoop

iOS-RunLoop浅谈

m0_52192682的博客 614

深入理解RunLoop

RunLoop 是 iOS 和 OSX 开发中非常基础的一个概念,这篇文章将从 CFRunLoop 的源码入手,介绍 RunLoop 的概念以及底层实现原理。之后会介绍一下在 iOS 中,苹果是如何利用 RunLoop 实现自动释放池、延迟回调、触摸事件、屏幕刷新等功能的。

码农--xc 1499

RunLoop解析

先看看官网对他的描述RunLoop是一个处理对象输入源的类,例如Port的调度,触摸事件,UI刷新事件,定时器事件,Selector事件,RunLoop还负责管理Timer事件。RunLoop和Thread对象是一一对应的,我们不能创建RunLoop,只可以获取,这里注意并不是每个Thread都有RunLoop。那么RunLoop的逻辑是什么呢?其实可以抽象的把它理解为跑圈,有事件处理的时候处理事件,在没有事件处理的时候,进入睡眠模式,从而节省CPU资源,底层逻辑是利用Do-while实现的。...

chabuduoxs的博客 584

OC-RunLoop深入了解

1.什么是RunLoop RunLoop的字面意思是运行循环,是在程序在运行过程中保持循环做一些事情,也就是保持程序的持续运行。每条线程都有唯一的一个与之对应的runloop对象,主线程的Runloop已经自己创建好,子线程的runloop需要主动创建。RunLoop在第一次获取时创建,在线程结束时销毁。主线程的runloop是默认开启的,iOS应用程序里面,程序启动后会调用main函数,mai...

lyz0925的博客 701
上一篇: 设备升级到ios5,又不想升级为 LION 而正常联机调试的方法
下一篇: UIView的剖析
zerocnd
博客等级 码龄18年 18粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值