1. GCD(Grand Central Dispatch)
1.1 减少线程开销
- GCD使用线程池管理线程,避免了频繁创建和销毁线程带来的开销。例如,在处理大量网络请求时,可以使用
dispatch_queue_t
创建一个队列来执行网络请求任务。
dispatch_queue_t networkQueue = dispatch_queue_create("com.example.networkQueue", DISPATCH_QUEUE_CONCURRENT);
for (NSURL *url in urlArray) {
dispatch_async(networkQueue, ^{
NSData *data = [NSData dataWithContentsOfURL:url];
// 处理数据
});
}
1.2 避免资源竞争
- 使用
dispatch_semaphore_t
信号量来控制对共享资源的访问。比如,多个线程需要访问同一个数据库时:
dispatch_semaphore_t semaphore = dispatch_semaphore_create(1);
dispatch_queue_t concurrentQueue = dispatch_queue_create("com.example.concurrentQueue", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(concurrentQueue, ^{
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
// 访问数据库
dispatch_semaphore_signal(semaphore);
});
1.3 提高数据处理效率
- 利用GCD的并行队列,将数据处理任务分解成多个子任务并行执行。例如,对一个大数据集进行计算:
dispatch_queue_t computeQueue = dispatch_queue_create("com.example.computeQueue", DISPATCH_QUEUE_CONCURRENT);
NSMutableArray *bigDataArray = [NSMutableArray arrayWithCapacity:1000];
// 填充数据
dispatch_apply(bigDataArray.count, computeQueue, ^(size_t index) {
id data = bigDataArray[index];
// 对数据进行计算
});
2. NSOperationQueue
2.1 减少线程开销
NSOperationQueue
同样基于线程池,能有效减少线程创建和销毁开销。创建一个操作队列并添加操作:
NSOperationQueue *operationQueue = [[NSOperationQueue alloc] init];
NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
// 执行任务
}];
[operationQueue addOperation:operation];
2.2 避免资源竞争
- 通过设置操作之间的依赖关系来避免资源竞争。比如,有操作A、B、C,操作C依赖于操作A和B的完成:
NSBlockOperation *operationA = [NSBlockOperation blockOperationWithBlock:^{
// 操作A任务
}];
NSBlockOperation *operationB = [NSBlockOperation blockOperationWithBlock:^{
// 操作B任务
}];
NSBlockOperation *operationC = [NSBlockOperation blockOperationWithBlock:^{
// 操作C任务
}];
[operationC addDependency:operationA];
[operationC addDependency:operationB];
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[queue addOperations:@[operationA, operationB, operationC] waitUntilFinished:NO];
2.3 提高数据处理效率
- 可以设置操作队列的最大并发数来优化数据处理效率。例如,在处理图片加载和处理任务时,设置合理的最大并发数避免过度占用资源:
NSOperationQueue *imageQueue = [[NSOperationQueue alloc] init];
imageQueue.maxConcurrentOperationCount = 5;
for (NSURL *imageURL in imageURLs) {
NSBlockOperation *imageOperation = [NSBlockOperation blockOperationWithBlock:^{
UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:imageURL]];
// 处理图片
}];
[imageQueue addOperation:imageOperation];
}
3. 不同场景下的适用性
3.1 GCD适用性
- 简单任务并行处理:适合快速创建和执行一些简单的异步任务,如网络请求、数据下载等。其语法简洁,对于轻量级任务能快速实现并行化。
- 对性能要求极高的场景:由于GCD基于系统底层实现,线程管理高效,在需要极致性能的计算密集型任务中表现出色。
3.2 NSOperationQueue适用性
- 复杂任务依赖管理:当任务之间存在复杂的依赖关系,如一个任务需要等待多个其他任务完成后再执行,
NSOperationQueue
通过操作依赖设置能很好地管理这种情况。
- 需要动态控制任务的场景:可以方便地添加、暂停、取消操作,适用于需要根据用户交互或业务逻辑动态调整任务执行的场景,比如在一个下载应用中,用户可以随时暂停或取消下载任务。