面试题答案
一键面试GCD队列主要类型及应用场景
- 串行队列(Serial Queue)
- 定义:每次只执行一个任务,前一个任务完成后才会执行下一个任务。
- 适用场景:
- 数据敏感操作:例如对数据库进行写入操作,确保数据的一致性。假设我们有一个日志记录类,每次写入日志需要保证顺序且不能同时进行多个写入操作以免数据混乱。
dispatch_queue_t serialQueue = dispatch_queue_create("com.example.serialQueue", DISPATCH_QUEUE_SERIAL);
dispatch_async(serialQueue, ^{
// 写入日志的操作
NSLog(@"写入日志:%@", [NSDate date]);
});
- **顺序依赖任务**:某些任务必须按顺序执行,如文件的解压和后续处理。先解压文件,完成后再进行文件内容的读取和解析。
2. 并发队列(Concurrent Queue) - 定义:可以同时执行多个任务,GCD会根据系统资源情况来决定同时执行的任务数量。 - 适用场景: - 数据处理密集型任务:例如图像处理,同时对多张图片进行滤镜处理。假设有一个图片数组,需要对每张图片应用高斯模糊滤镜。
dispatch_queue_t concurrentQueue = dispatch_queue_create("com.example.concurrentQueue", DISPATCH_QUEUE_CONCURRENT);
NSArray<UIImage *> *imageArray = // 图片数组
for (UIImage *image in imageArray) {
dispatch_async(concurrentQueue, ^{
UIImage *filteredImage = [self applyGaussianBlur:image];
// 处理滤镜后的图片,如保存等
});
}
- **网络请求**:同时发起多个网络请求获取不同的数据,比如同时获取用户信息、用户好友列表、用户设置等数据。
3. 主队列(Main Queue) - 定义:专门用于处理主线程任务的队列,在主线程上执行。UI更新等操作必须在主队列中执行。 - 适用场景: - UI更新:任何涉及到更新UI界面的操作,如改变视图的背景颜色、显示提示框等。例如在网络请求获取到新数据后更新UITableView的显示。
dispatch_async(dispatch_get_main_queue(), ^{
// 更新UI,如刷新tableView
[self.tableView reloadData];
});
- **用户交互响应**:处理用户的点击、滑动等交互事件,因为这些事件的处理需要及时更新UI反馈给用户。