1.主线程阻塞,其他任何操作都无法操作
2.需要快速进行多个任务计算的场景,使用多线程能明显提高单位时间内的计算效率
常驻线程:
AFNetworking2.0专门创建了一个线程来接收NSOperationQueue的回调,这个线程其实就是一个常驻线程。
通过NSRunLoop添加runloop的方法有三个:
1.run方法:通过run方法添加的runloop,会不断地重复调用runMode:beforeDate:方法。来保证自己不会停止
2.runUntilDate:和runMode:beforeDate方法,这两个方法添加的runloop可以通过指定时间来停止runloop.
AFNetworking2.0和AFNetworking3.0的区别:
AFNetworking2.0使用的是NSURLConnection发请求
AFNetworking3.0使用的是NSURLSession
被替换的原因是:避免常驻线程的坑,NSURLConnection不能指定回调NSOperationQueue队列,使得线程一直常驻在内存中,不安全。而NSURLSession请求则可以避免这种情况发生。
需要保活线程一段时间的方法
使用NSRunLoop的另外两个方法:
runUntilDate:
runMode:beforeDate:
CFRunLoopRef的CFRunLoopRun和CFRunLoopStop
可以指定线程的保活时长,让线程存活的时间可预期,总比让线程常驻得好。至少在硬件资源利用率这点更加合理
并发:
以使用GCD为例来说明多线程的并发问题
在进行数据读写操作时,总需要一段时间来等待磁盘响应,如果在这个时候通过GCD发起一个任务,GCD本着最大化利用CPU的原则,会等待磁盘响应的这个空档,再创建一个新线程来保证能够充分利用CPU。常见案例有数据库(FMDB)的读写操作。
FMDB数据库:通过FMDatabaseQueue这个核心的类,将读写数据库相关的磁盘都放到一个串行队列里执行,从而避免线程创建过多导致系统资源紧张的情况。
总结:类似数据库这种需要频繁读写磁盘操作的任务,尽量使用串行队列来管理,闭麦你因为多线程并发而出现内存问题
网友评论