- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
//手动设置任务之间依赖关系,进而改变自动的执行顺序
[self createDependency];
}
- (void)createDependency {
/*需求:往非主队列中添加三个任务Task1;Task2;Task3
自动执行顺序:三个任务同时执行
改后的执行顺序:任务三等待任务一和任务二执行完毕,才执行
依赖关系:task3->task2; task3->task1
*/
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
NSBlockOperation *firstOperation = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"开始下载图片一...");
[NSThread sleepForTimeInterval:3];
NSLog(@"下载图片一完成");
}];
NSBlockOperation *secondOperation = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"开始下载图片二...");
[NSThread sleepForTimeInterval:5];
NSLog(@"下载图片二完成");
}];
NSBlockOperation *thirdOperation = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"下载图片三");
}];
//设置/添加依赖关系
/* 注意点:
1. 千万不要造成循环依赖(死锁)
2. 依赖关系在添加到队列之前
*/
[thirdOperation addDependency:firstOperation];
[thirdOperation addDependency:secondOperation];
[queue addOperation:firstOperation];
[queue addOperation:secondOperation];
[queue addOperation:thirdOperation];
}
//同步执行
- (IBAction)blockSync:(id)sender {
//1.创建操作对象
NSBlockOperation *operation = [[NSBlockOperation alloc] init];
//2.添加任务
[operation addExecutionBlock:^{
//要执行的任务
NSLog(@"下载图片一:%@", [NSThread currentThread]);
}];
[operation addExecutionBlock:^{
//要执行的任务
NSLog(@"下载图片二:%@", [NSThread currentThread]);
}];
[operation addExecutionBlock:^{
//要执行的任务
NSLog(@"下载图片三:%@", [NSThread currentThread]);
}];
[operation addExecutionBlock:^{
//要执行的任务
NSLog(@"下载图片四:%@", [NSThread currentThread]);
}];
[operation addExecutionBlock:^{
//要执行的任务
NSLog(@"下载图片五:%@", [NSThread currentThread]);
}];
//3.执行任务(同步执行任务几乎不用;没有规律)
[operation start];
}
//异步执行 -》保证子线程执行
- (IBAction)blockAsync:(id)sender {
//1.创建操作对象(方式二:常用; 创建和添加任务合二为一)
NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"下载图片一:%@", [NSThread currentThread]);
}];
NSBlockOperation *anotherOperation = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"下载图片二:%@", [NSThread currentThread]);
//回到主线程(获取主队列)
// [[NSOperationQueue mainQueue] addOperationWithBlock:^{
// //主线程执行
// NSLog(@"回到主线程更新界面:%@", [NSThread currentThread]);
// }];
}];
NSBlockOperation *thirdOperation = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"下载图片三....%@",[NSThread currentThread]);
}];
NSBlockOperation *forthOperation = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"下载图片四....%@", [NSThread currentThread]);
}];
NSBlockOperation *fifthOperation = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"下载图片五....%@", [NSThread currentThread]);
}];
NSBlockOperation *sixthOperation = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"下载图片六....%@", [NSThread currentThread]);
}];
//2.创建非主队列
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
//2.1 设置最大同时执行的任务的个数
queue.maxConcurrentOperationCount = 2;
//3.操作对象放到非主队列中(自动执行)
[queue addOperation:operation];
[queue addOperation:anotherOperation];
[queue addOperation:thirdOperation];
[queue addOperation:forthOperation];
[queue addOperation:fifthOperation];
[queue addOperation:sixthOperation];
// //如何暂停队列中的所有任务;
// [queue setSuspended:YES];
// //把队列中的所有暂停的任务重新启动
// [queue setSuspended:NO];
// //如何取消队列中的所有任务(不会恢复;从队列中移除)
// [queue cancelAllOperations];
}
NSBlockOperation使用
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
相关阅读更多精彩内容
- 1 NSOperation NSOperation 自身是一个抽象类,定义了一个要执行的工作,可以定义一个 NSO...
- 文 | 空境180s栏目组 这里我想说 我们每一期修出来的不一定是标答或者最好的 每个人的创意和脑洞我们都尊重 修...