1、多线程技术在 iOS 开发中的使用 进程和线程要使用多线程,首先需要理解进程和线程这 2 个概念。这里我简单的说一下。所谓进程对应的是一个应用程序,负责开辟内存空间供应用程序使用,但是进程不能执行任务( 指令) 。一个进程至少包含一条线程,线程是程序的执行流。iOS 程序启动时,在创建一个进程的同时, 会开始运行一个线程,该线程被称为主线程系统中的每一个进程都有自己独立的虚拟内存空间,而同一个进程中的多个线程则共用进程的内存空间每创建一个新的线程,都会消耗一定内存和 CPU 时间当多个线程对同一个资源出现争夺的时候需要注意线程安全问题多线程的应用及使用注意事项将耗时、轮询或者并发需求高等任务分
2、配到其他线程执行,并由主线程负责统一更新界面会使得应用程序更加流畅,用户体验更好,例如网络请求,播放游戏的背景音乐等。线程使用不是无节制的iOS 中的主线程的堆栈大小是 1M从第二个线程开始都是 512KB这些数值不能通过编译器开关或线程 API 函数更改注:更新 UI 界面,处理界面和用户之间的交互事件一定要在主线程中处理。iOS 中的多线程技术 1.NSObject 的多线程方法- 对 NSThread 的封装(一个 NSThread 对象对应一条线程)开启后台线程执行任务的方法-(void)performSelectorInBackground:(SEL)aSelector withOb
3、ject:(id)arg在后台线程中通知主线程执行任务的方法(void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait;获取线程信息NSThread currentThread;线程休眠 NSThread sleepForTimeInterval:1.0f;提示:performSelectorInBackground 方法本身是在主线程中执行的,而选择器指定的方法是在后台线程中进行的尽管使用 performSelectorInBackground 方法调用的任务可以更新
4、 UI 界面,但是在实际开发中,涉及到 UI 界面的更新操作,还是要使用 performSelectorOnMainThread 方法,以避免不必要的麻烦注:内存管理对于多线程非常重要Objective-C 可以凭借 autoreleasepool 使用内存资源,并需要时回收资源每个线程都需要有autoreleasepool,否则可能会出现内存泄漏2.NSThread创建线程方法:1.+ (void)detachNewThreadSelector:(SEL)selector toTarget:(id)target withObject:(id)argument;2.- (id)initWith
5、Target:(id)target selector:(SEL)selector object:(id)argument;参数说明:selector:线程执行的方法,只能有一个参数,不能有返回值target:selector 消息发送的对象argument:传输给 target 的唯一参数,也可以是 nil3.NSOperation/NSOperationQueueNSOperation 的两个子类1.NSInvocationOperation2.NSBlockOperation工作原理:1.用 NSOperation 封装要执行的操作2.将创建好的 NSOperation 对象放 NSOpe
6、rationQueue 中3.启动 OperationQueue 开始新的线程执行队列中的操作注意事项:1.使用多线程时通常需要控制线程的并发数,因为线程会消耗系统资源,同时运行的线程过多,系统会变慢2.使用以下方法可以控制并发的线程数量:-(void)setMaxConcurrentOperationCount:(NSInteger)cnt;3.使用 addDependency 可以建立操作之间的依赖关系,设定操作的执行顺序上面的程序设置依赖关系后,只有等操作 a 和 b 都执行完,才会执行 c.4.GCDGCD 队列:1.全局队列:所有添加到主队列中的任务都是并发执行的(可能会开启多条线程
7、)dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);2.串行队列:所有添加到串行队列中的任务都是顺序执行的(只可能会开启一条线程)dispatch_queue_t queue = dispatch_queue_create(“myQueue“, DISPATCH_QUEUE_SERIAL);3.主队列:所有添加到主队列中的任务都是在主线程中执行的dispatch_get_main_queue();异步操作dispatch_async 在其他线程执行任务,会开启新的线程异步方法无法确定任务的执行顺序同步操作dispatch_sync 在当前在线程执行任务,不开启新的线程同步操作与队列无关同步方法会依次执行,能够决定任务的执行顺序更新界面 UI 时,最好使用同步方法注:同步还是异步,取决于方法名(不影响主队列,影响全局队列、串行队列) 。试例 1:分析:虽然任务都是添加到全局队列中,但是都是同步操作,所以不会开启新的线程,是在当前线程中执行任务。试例 2:分析:将 3 个任务添加到串行队列中,虽然是异步的操作,会开启新的线程,但最多最会开启一个。试例 3:分析:不管是同步还是异步的任务添加到主队列中,都是在主线程中执行