1.无论使用哪种线程方法进行多线程开发, 每个线程启动后不一定立即执行相应的操作, 具体什么时候执行由系统调用(CPU 空闲时就会执行)
2.更新 UI 应该在主线程(UI线程)进程, 并且异步调用, 避免造成线程阻塞, 常用的方法如下:
- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait;
//方法传递主线程[NSThread mainThread])
- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(id)arg waitUntilDone:(BOOL) wait;
[NSOperationQueue mainQueue] addOperationWithBlock:
//在主线程中,这里改用同步调用 dispatch_sync 的话就会造成线程阻塞情况
dispatch_async(dispatch_get_main_queue(), ^{})
3.NSThread 适合轻量级多线程开发, 控制线程顺序比较难, 同时线程总数无法控制(每次创建并不能重用, 只能从新创建一个新的线程)
4.对于简单的多线程开发建议使用 NSObject 的扩展方法完成, 而不必使用 NSThread
5.可以使用 NSThread 的 currentThread 方法取得当前线程, 使用sleepForTimeInterval方法让当前线程挂起
6.NSOperation 进行多线程开发可以控制线程总数以及依赖关系
7.创建一个 NSOperation 不应该直接调用 start 方法, (如果直接 start 则会在主线程中调用), 而是应该放到NSOperationQueue 中启动
8.相比 NSInvocationOperation 推荐使用 NSBlockOperation, 代码简单, 同时由于闭包性使得它没有传参问题
9.NSOperation 是对 GCD 面向对象的 OC 封装, 而 GCD 基于 C 语言开发, 效率更高, 建议如果任务之间如果有依赖关系或者想要监听任务完成状态的情况下优先使用 NSOperation, 否则使用 GCD
10.NSOperation 是一个对象的基类, 表示一个独立的计算单元, 可以为子类提供有用且线程安全的建立状态, 优先级, 线程数据, 依赖等待取消等操作
11,在 CGD 中串行队列中的任务被安排到一个单一线程执行(不止主线程), 可以方便地控制执行顺序, 并发队列在多个线程中执行(前提是使用异步方法,), 顺序控制相对复杂, 但是更高效
12.在 GCD 中一个操作是多线程还是单线程执行, 取决于当前队列类型和执行方法, 只有队列类型为并行队列并且使用异步方法执行时才能在多个线程中执行(如果是并行队列使用同步方法调用则会在主线程中执行)
多线程
好处:
1.使用线程可以把程序中占据时间长的任务放到后台去处理, 如图片、视频的下载
2.充分发挥多核处理器的优势, 并发执行让系统运行的更快更流畅, 用户体验好
缺点:
1.大量的线程降低代码的可读性
2,更多的线程需要更多的内存空间
3当多个线程对同一资源出现争夺的时候, 要注意线程安全的问题
iOS 三种多线程的编程技术
1.NSThread
2.NSOperation(NSOperationQueue)
3.GCD
任务的执行, 考虑到线程和进程的关系, 考虑到性能和安全的兼顾, 这个过程肯定有不同的节奏
默认主线程是1M, 子线程是512KB, 如果开启了大量的子线程就会消耗更多的内存空间, 影响降低程序的性能
网友评论