多线程与RunLoop
iOS开发中的多线程
iOS中多线程实现方案

1.pthread -- POSIX Thread iPhone2.0
2. NSThread -- 一个NSThread对象代表一条线程
其他创建线程方式创建线程后自动启动[NSThread detachNewThreadSelector:toTarget:withObject:];隐式创建线程后自动启动[self performSelectorInBackground:withObject:]; // NSObject的方法



3.GCD -- Grand Central Dispatch "牛逼的中枢调度器"















4. NSOperation
1> 基本使用


》NSBlockOperation
3> NSOperationQueue
- (void)setMaxConcurrentOperationCount:(NSInteger)cnt;
[operationB addDependency:operationA]; // 操作B依赖于操作A
RunLoop
不能显示的创建管理runloop,每个thread自己就会有一个runloop,在当前线程调用 currentRunLoop方法就能得到线程对应的runloop
作用
。使程序一直运行并接收用户输入
。决定程序在何时处理那些Event
。调用解耦(--消息队列)
。节省CPU时间
RunLoops in Cocoa
Cocoa中跟RunLoop有关的类
NSTimer,UIEvent,Autorelease,NSDelayedPerforming,NSThreadPerformAddition
CADisplayLink,CATransition,CAAnimation,dispatch_get_main_queue(), NSURLConnnection.....
调用堆栈中
Xcode调试时调用堆栈中以__CFRunLoopxxxxxx的函数
RunLoop机制

》CFRunLoopTimer
RunLoopTimer的封装
+ (NSTimer *)timerWithTimeInterval: invocation: repeats:
+ (NSTimer *)scheduledTimerWithInterval: invocation: repeats:
- (void)performSelector: withObject: afterDelay: inModes:
+ (CADisplayLink *)dispalyLinkWithTarget: selector:
- (void)addToRunLoop: forMode:
》CFRunLoopSource
Source是RunLoop的数据源抽象类(protocol)
RunLoop定义了两个Version的Source:
1. Source0:处理App内部事件、App自己负责管理(触发)如UIEvent、CFSocket
2. Source1:由RunLoop和内核管理、Mach port驱动,如CFMachPort,CFMessagePort
》CFRunLoopObserver

》CFRunLoopMode
。RunLoop在同一时间段只能且必须在一种特定Mode下Run
。更换Mode时,需要停止当前loop,然后重启新loop
。Mode是iOS App滑动顺畅的关键
NSDefalutRunLoopMode
默认状态、空闲状态
UITrackingRunLoopMode
滑动ScrollView时
UIInitializationRunLoopMode
私有,App启动时
NSRunLoopCommonModes
以上一个或几个的组合(可以自己定义组合)

ScrollView滑动时RunLoopMode的切换:NSDefalutRunLoopMode -开始滑动-> UITrackingRunLoopMode -停止滑动-> NSDefalutRunLoopMode
》GCD中dispatch到main queue的block被分发到main RunLoop执行,dispatch_after同理
》RunLoop的挂起和唤醒
》AFNetworking中创建了一个单例network 线程,用RunLoop让这个线程常驻(不会执行完某次网络操作就杀掉)
这样子是否只开了一个网络请求子线程?
多线程与RunLoop的更多相关文章
- iOS开发——多线程篇——RunLoop
一.简介 1.什么是RunLoop从字面意思看运行循环跑圈 基本作用保持程序的持续运行处理App中的各种事件(比如触摸事件.定时器事件.Selector事件)节省CPU资源,提高程序性能:该做事时做事 ...
- 多线程(RunLoop)
1.RunLoop的概念及作用 2.RunLoop的使用 3.RunLoop的相关类 4.RunLoop的工作原理 5.小结 6.思考 什么是RunLoop? 从字面意思上是一直循环跑,事实上就是一个 ...
- RunLoop 总结:RunLoop的应用场景(二)
上一篇讲了使用RunLoop保证子线程的长时间存活,而不是执行完任务后就立刻销毁的应用场景.这一篇就讲述一下RunLoop如何保证NSTimer在视图滑动时,依然能正常运转. 参考资料 好的书籍都是值 ...
- QF——网络之知识碎片
1.URL中文问题: URL不支持中文.若出现中文,需要对URL进行utf-8编码. NSString *urlString = [kULRSTRING stringByAddingPercentEs ...
- iOS中多线程原理与runloop介绍
一.线程概述 有些程序是一条直线,起点到终点:有些程序是一个圆,不断循环,直到将它切断.直线的如简单的Hello World,运行打印完,它的生命周期便结束了,像昙花一现那样:圆如操作系统,一直运行直 ...
- iOS 多线程:『RunLoop』详尽总结
1. RunLoop 简介 1.1 什么是 RunLoop? 可以理解为字面意思:Run 表示运行,Loop 表示循环.结合在一起就是运行的循环的意思.哈哈,我更愿意翻译为『跑圈』.直观理解就像是不停 ...
- ios多线程原理及runloop介绍
一.线程概述 有些程序是一条直线,起点到终点:有些程序是一个圆,不断循环,直到将它切断.直线的如简单的Hello World,运行打印完,它的生命周期便结束了,像昙花一现那样:圆如操作系统,一直运行直 ...
- iOS多线程-RunLoop简介
什么是RunLoop? 从字面上来看是运行循环的意思. 内部就是一个do{}while循环,在这个循环里内部不断的处理各种任务(比如:source/timer/Observer) RunLoop的存在 ...
- Runloop, 多线程
Runloop是个死循环,为甚么? 1. 保证程序不退出 2.监听用户的事件, 触摸,时钟,网络事件 UITrackingMode,只能触摸事件,没有触摸事件了,直接就停止了 Runloop: sou ...
随机推荐
- Spring官网阅读(十七)Spring中的数据校验
文章目录 Java中的数据校验 Bean Validation(JSR 380) 使用示例 Spring对Bean Validation的支持 Spring中的Validator 接口定义 UML类图 ...
- 【Scala】Actor并发编程实现单机版wordCount
文章目录 对单个文本文件进行单词计数 对多个文本文件进行单词计数 对单个文本文件进行单词计数 import scala.actors.Actor import scala.io.Source //读取 ...
- Linux内核驱动学习(八)GPIO驱动模拟输出PWM
文章目录 前言 原理图 IO模拟输出PWM 设备树 驱动端 调试信息 实验结果 附录 前言 上一篇的学习中介绍了如何在用户空间直接操作GPIO,并写了一个脚本可以产生PWM.本篇的学习会将写一个驱动操 ...
- 在dynamics 365 中,看字段的描述需要到系统字段设置里面才能看到,这里提供一种sql直接看字段和实体名描述的方法
1.在crm对应的主数据库执行下面存储过程: -- ============================================= -- Author: <Author,,Name& ...
- [linux] VNC the connection was refused by the computer
在用VNC 连接host的时候发现“”“the connection was refused by the computer ” 方法:发现登录这个host,敲打:verser 的时候出现了这个: 它 ...
- TreeSet的两种实现方法:Comparable和Comparator(Java比较器)
Comparable与Comparator实际上是TreeSet集合的两种实现方式,用来实现对象的排序.下边介绍一下两种比较器的使用方法和区别. Comparable称为元素的自然顺序,或者叫做默认顺 ...
- MySQL编程
MySQL 使用标准 SQL 检索和处理数据,体积小.开源.免费,易于快速部署.正是因为这些特点,使得其在互联网行业,特别是 Web 应用方面使用相当广泛.至今最新的版本已到 8.0. 一 基本操作 ...
- 力扣题解-LCP 06. 拿硬币
题目描述 桌上有 n 堆力扣币,每堆的数量保存在数组 coins 中.我们每次可以选择任意一堆,拿走其中的一枚或者两枚,求拿完所有力扣币的最少次数. 示例 1: 输入:[4,2,1] 输出:4 解释: ...
- ambari hdp ssh链接错误
错误信息: ERROR 2019-09-05 10:29:05,700 NetUtil.py:96 - EOF occurred in violation of protocol (_ssl.c:57 ...
- JS的函数和对象二
复习 递归,在函数内部调用自身 return 匿名函数 function(){ } 创建函数,函数表达式 var fn=function(){ } 自调用 (function(){ ...
