信号量

作者: 守护浪漫的小香樟 | 来源:发表于2019-03-28 10:10 被阅读0次

当需要多个操作顺序执行,并且一次操作存在上限时候需要用到信号量(如批量下载,最多一次下载两个其他的等待)


一、不使用信号量

//第1个下载

[self downLoadWithUrlString:@"https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1553747056229&di=7eec490de4bc8f8755681f84c72e5ea1&imgtype=0&src=http%3A%2F%2Fpic14.nipic.com%2F20110529%2F7570613_004640647181_2.jpg" count:1];

//第2个下载

[self downLoadWithUrlString:@"https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1553746618224&di=fec695ff3469658cdb8431b11e07d5b8&imgtype=0&src=http%3A%2F%2Fpic31.nipic.com%2F20130630%2F7447430_165944650000_2.jpg" count:2];

//第3个下载

[self downLoadWithUrlString:@"https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1553746639550&di=06727db028f00523f12571756525d600&imgtype=0&src=http%3A%2F%2Fbbswater-fd.zol-img.com.cn%2Ft_s1200x5000%2Fg5%2FM00%2F0E%2F08%2FChMkJlrdXhCIHezjAAvWP5q8sbMAAn0iAA90kYAC9ZX715.jpg" count:3];

下载方法

- (void)downLoadWithUrlString:(NSString*)urlString count: (NSInteger)count

 {

         // 1.创建管理者对象

         AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

         // 2.设置请求的URL地址

         NSURL*url = [NSURLURLWithString:urlString];

         // 3.创建请求对象

         NSURLRequest *request = [NSURLRequest requestWithURL:url];

         // 4.下载任务

         NSURLSessionDownloadTask*task = [managerdownloadTaskWithRequest:requestprogress:^(NSProgress*_NonnulldownloadProgress) {

                 // 下载进度

                 NSLog(@"当前下载进度为:%lf",1.0* downloadProgress.completedUnitCount/ downloadProgress.totalUnitCount);

             }destination:^NSURL*_Nonnull(NSURL*_NonnulltargetPath,NSURLResponse*_Nonnullresponse) {

                     // 下载地址

                 NSLog(@"默认下载地址****************************:%@",targetPath);

                     // 设置下载路径,通过沙盒获取缓存地址,最后返回NSURL对象

                     NSString *filePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)lastObject];

                     return[NSURLfileURLWithPath:filePath];// 返回的是文件存放在本地沙盒的地址

                 }completionHandler:^(NSURLResponse*_Nonnullresponse,NSURL*_NullablefilePath,NSError*_Nullableerror) {

                         // 下载完成调用的方法

                     NSLog(@"****************************: 第%li个文件\n****************************: 文件路径\n%@\n",count, filePath);

                     }];

         // 5.启动下载任务

         [taskresume];

 }

下载结果是按照231的顺序下载的


二、使用信号量

    //创建信号量2代表一次性最多执行两个操作,两个操作执行完之后在执行第三个操作

    dispatch_semaphore_t sempone = dispatch_semaphore_create(2);

    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

//创建任务1

    dispatch_async(queue, ^{

        dispatch_semaphore_wait(sempone, DISPATCH_TIME_FOREVER);

        NSLog(@"run task 1");

        [self downLoadWithUrlString:@"https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1553747056229&di=7eec490de4bc8f8755681f84c72e5ea1&imgtype=0&src=http%3A%2F%2Fpic14.nipic.com%2F20110529%2F7570613_004640647181_2.jpg" count:1];

        sleep(3);

        NSLog(@"complete task 1");

        dispatch_semaphore_signal(sempone);

    });

//创建任务2

    dispatch_async(queue, ^{

        dispatch_semaphore_wait(sempone, DISPATCH_TIME_FOREVER);

        NSLog(@"run task 2");

        [self downLoadWithUrlString:@"https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1553746618224&di=fec695ff3469658cdb8431b11e07d5b8&imgtype=0&src=http%3A%2F%2Fpic31.nipic.com%2F20130630%2F7447430_165944650000_2.jpg" count:2];

        sleep(3);

        NSLog(@"complete task 2");

        dispatch_semaphore_signal(sempone);

    });

//创建任务3

    dispatch_async(queue, ^{

        dispatch_semaphore_wait(sempone, DISPATCH_TIME_FOREVER);

        NSLog(@"run task 3");

        [self downLoadWithUrlString:@"https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1553746639550&di=06727db028f00523f12571756525d600&imgtype=0&src=http%3A%2F%2Fbbswater-fd.zol-img.com.cn%2Ft_s1200x5000%2Fg5%2FM00%2F0E%2F08%2FChMkJlrdXhCIHezjAAvWP5q8sbMAAn0iAA90kYAC9ZX715.jpg" count:3];

        sleep(3);

        NSLog(@"complete task 3");

        dispatch_semaphore_signal(sempone);

    });

下载结果如下:

我们可以看到complete task 2 complete task 1  之后 run task 3

第一个第二个下载完成之后执行第三个下载,那么我们信号量控制操作个数的任务就完成了

相关文章

  • 第二章 信号量机制及几个经典例题

    1.信号量机制 信号量机制即利用pv操作来对信号量进行处理。 什么是信号量?信号量(semaphore)的数据结构...

  • iOS底层--GCD应用

    手动目录GCD简介信号量信号量的理解信号量的使用信号量的代码实操信号量阻塞哪里的任务?栅栏函数dispatch_b...

  • dispatch_semaphore_t

    dispatch_semaphore_t :信号量包含三个函数:1、创建信号量 2、增加信号量 3、削减信号量 注...

  • [java并发编程]基于信号量semaphore实现限流器

    [TOC] 一、什么是信号量 “信号量”在编程术语中使用单词semaphore,那什么是“信号量”?信号量就好比你...

  • iOS GCD信号量的使用

    什么是信号量 信号量是一种特殊的变量,访问具有原子性。 当信号量大于0时执行wait操作信号量会减1, 当信号量为...

  • dispatch_semaphore_t

    一、信号量 semaphore叫做“信号量” 1、创建信号量dispatch_semaphore_create(l...

  • GCD信号量使用

    一、信号量 semaphore叫做“信号量” 1、创建信号量dispatch_semaphore_create(l...

  • 理解操作系统之信号量的应用

    利用信号量实现进程互斥(模式) 利用信号量实现前驱关系(模式) 利用记录型信号量实现同步(模式) 1.利用信号量实...

  • FreeRTOS学习笔记(4)——信号量

    一、头文件 二、二值信号量 2.1 运作机制 创建信号量时,系统会为创建的信号量对象分配内存,并把可用信号量初始化...

  • CRTOS——互斥信号量

    互斥信号量等待操作: 1、等待互斥信号量,互斥信号量未被占有(锁定次数为0),占有过程中将信号量拥有者指向任务,并...

网友评论

      本文标题:信号量

      本文链接:https://www.haomeiwen.com/subject/slmfbqtx.html