iOS开发中的多线程
iOS中多线程实现方案
![](https://i-blog.csdnimg.cn/blog_migrate/ee43c131a7b89d1943feef62c2e6580e.png)
1.pthread -- POSIX Thread iPhone2.0
2. NSThread -- 一个NSThread对象代表一条线程
其他创建线程方式创建线程后自动启动[NSThread detachNewThreadSelector:toTarget:withObject:];隐式创建线程后自动启动[self performSelectorInBackground:withObject:]; // NSObject的方法
![](https://i-blog.csdnimg.cn/blog_migrate/adc262b3fdb9d31ae16d5594494fd569.png)
![](https://i-blog.csdnimg.cn/blog_migrate/1e8705e62430a210f493887bf1a3eea7.png)
![](https://i-blog.csdnimg.cn/blog_migrate/db006588b05a3ff2aae55a06366f56ab.png)
3.GCD -- Grand Central Dispatch "牛逼的中枢调度器"
![](https://i-blog.csdnimg.cn/blog_migrate/69b5cdf8c2af20424193b50873855f98.png)
![](https://i-blog.csdnimg.cn/blog_migrate/d0ba885dc56886c9044a5672869935d7.png)
![](https://i-blog.csdnimg.cn/blog_migrate/8cbb6a24167c8035d0f5a8002b03d4f1.png)
![](https://i-blog.csdnimg.cn/blog_migrate/d50a886af3ca96511e11bd8045763d64.png)
![](https://i-blog.csdnimg.cn/blog_migrate/a8d255413345fa0afa5240cff44f623e.png)
![](https://i-blog.csdnimg.cn/blog_migrate/599dd89a8f2fb6ccb93d4c849e1e39aa.png)
![](https://i-blog.csdnimg.cn/blog_migrate/74ae20933e7de1afa6649afb6c19ec59.png)
4. NSOperation
1> 基本使用
![](https://i-blog.csdnimg.cn/blog_migrate/55c4bc029fd1986815f1d707dee70602.png)
* 最大并发数设置
- (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让这个线程常驻(不会执行完某次网络操作就杀掉)
这样子是否只开了一个网络请求子线程?