队列类型
- 主队列(Main Queue):
- 特点:是与主线程关联的队列,在主线程上执行任务。主队列是串行队列,同一时间只有一个任务在主线程执行。
- 区别:它专门用于处理UI更新等必须在主线程执行的操作,因为UIKit等框架不是线程安全的,必须在主线程操作。而其他队列(如全局队列和自定义队列)是在后台线程执行任务。
- 场景:更新UI界面,例如修改UILabel的文本、刷新UITableView等。比如在网络请求获取数据后,需要将数据显示到界面上,就把更新UI的代码放在主队列中执行。示例代码如下:
dispatch_async(dispatch_get_main_queue(), ^{
// 更新UI的代码,如修改UILabel的文本
self.myLabel.text = @"更新后的文本";
});
- 全局队列(Global Queue):
- 特点:是系统提供的并发队列,有不同优先级(高、默认、低、后台)。多个任务可以同时在不同线程并行执行(取决于系统资源)。
- 区别:与主队列相比,它在后台线程执行任务,可并行处理;与自定义队列相比,它是系统预定义的,无需手动创建。
- 场景:适合执行一些不需要在主线程执行且可以并发处理的任务,如数据的批量处理、网络请求(多个请求可并发)等。例如,下载多个图片,可以将每个下载任务添加到全局队列中。示例代码如下:
dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
for (int i = 0; i < 5; i++) {
dispatch_async(globalQueue, ^{
// 下载图片的任务
NSURL *imageURL = [NSURL URLWithString:@"http://example.com/image.jpg"];
NSData *imageData = [NSData dataWithContentsOfURL:imageURL];
// 处理下载后的图片数据
});
}
- 自定义队列(Custom Queue):
- 特点:可以通过
dispatch_queue_create
函数创建,可以是串行队列也可以是并发队列。自定义队列的优先级可以在创建时设置(虽然实际效果可能因系统而异)。
- 区别:与主队列和全局队列相比,它更灵活,可以根据需求定制队列的属性(串行或并发)。主队列只能是串行且关联主线程,全局队列是系统预定义的并发队列。
- 场景:当需要对一组任务进行特定的顺序控制(串行执行)或者需要并发执行且有特定优先级等特殊需求时使用。比如,有一组文件操作任务,要求按顺序执行,就可以创建一个串行自定义队列。示例代码如下:
dispatch_queue_t customQueue = dispatch_queue_create("com.example.customQueue", DISPATCH_QUEUE_SERIAL);
dispatch_async(customQueue, ^{
// 文件操作任务1
});
dispatch_async(customQueue, ^{
// 文件操作任务2,会在任务1完成后执行
});
- 如果需要并发执行任务,创建并发自定义队列示例如下:
dispatch_queue_t customConcurrentQueue = dispatch_queue_create("com.example.customConcurrentQueue", DISPATCH_QUEUE_CONCURRENT);
for (int i = 0; i < 3; i++) {
dispatch_async(customConcurrentQueue, ^{
// 并发执行的任务
});
}