利用多线程解决相关的问题

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这个核心的类,将读写数据库相关的磁盘都放到一个串行队列里执行,从而避免线程创建过多导致系统资源紧张的情况。

总结:类似数据库这种需要频繁读写磁盘操作的任务,尽量使用串行队列来管理,闭麦你因为多线程并发而出现内存问题

你可能感兴趣的:(利用多线程解决相关的问题)