在 IOS 中有几种常用的多线程方案:
- NSThread:最基本的线程类,可以直接创建线程并执行任务。
objc
NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(doTask) object:nil];
[thread start];
- (void)doTask {
// 执行任务
}
- GCD:Grand Central Dispatch,作废底层 API 形式提供的多线程功能。GCD 共有异步(dispatch_async)同步(dispatch_sync)两种方式。
objc
// 异步执行任务
dispatch_async(dispatch_get_global_queue(0, 0), ^{
// 执行任务
});
// 同步执行任务
dispatch_sync(dispatch_get_global_queue(0, 0), ^{
// 执行任务
});
- NSOperation / NSOperationQueue:封装 GCD,提供更高级的多线程接口。
objc
// 创建操作
MyOperation *op = [[MyOperation alloc] init];
// 添加到队列
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[queue addOperation:op];
在 iOS 多线程编程时,有几点需要注意:
- 不要在非主线程中进行 UI 操作,这会导致异常。
- 资源使用需加锁,如修改字典、数组时使用 lock。
- 使用 GCD 时dispatch_get_main_queue() 切换到主线程。
- 避免线程阻塞,否则会影响 App 性能。
- 线程安全,某些类线程不安全,使用时需注意。
多线程使得 App 可以同时执行多个任务,大大提高性能。但如果不当使用也会导致许多问题,需要谨慎考虑。