美文网首页iOS取经之路
iOS 100个下载任务,最多同时开5个线程。

iOS 100个下载任务,最多同时开5个线程。

作者: 上帝很忙 | 来源:发表于2018-09-05 15:42 被阅读297次

1.思路:利用GCD信号量:dispatch_semaphore_signal

    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_semaphore_t semaphore = dispatch_semaphore_create(5);
    
    for (int i = 0 ; i<100; i++) {
        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
        dispatch_async(queue, ^{
            NSLog(@"任务%d开始",i);
            sleep(i);
            NSLog(@"任务%d结束",i);
            
            dispatch_semaphore_signal(semaphore);
        });
    }

log:

创建5个任务.png 结束一个任务才开始新的任务.png

2.模拟下载任务
下载20集连续剧

    //20集电视剧资源,项目中替换为下载链接  www.xxxxxx.com/movie/xxxx_1;www.xxxxxx.com/movie/xxxx_2
    NSArray*moviesArray = [NSArray arrayWithObjects:
                           @"第1集", @"第2集",@"第3集",@"第4集",@"第5集",
                           @"第6集",@"第7集",@"第8集",@"第9集",@"第10集",
                           @"第11集", @"第12集",@"第13集",@"第14集",@"第15集",
                           @"第16集",@"第17集",@"第18集",@"第19集",@"第20集",
                           nil];
    
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_semaphore_t semaphore = dispatch_semaphore_create(5);
    
    for (int i = 0 ; i<moviesArray.count; i++) {
        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
        dispatch_async(queue, ^{
            //www.xxxxxx.com/movie/xxxx_i
            //模拟下载任务
            NSLog(@"%@开始下载",moviesArray[i]);
            sleep(10+i*2);//假设下载一集需要10+i*2秒
            NSLog(@"%@下载完成",moviesArray[i]);
            
            dispatch_semaphore_signal(semaphore);
        });
    }

log:


电视剧下载.gif

3.GCD信号量概念


GCD信号量概念.png

上图节选自https://www.jianshu.com/p/324c2fded696 信号量一节

相关文章

  • iOS 100个下载任务,最多同时开5个线程。

    1.思路:利用GCD信号量:dispatch_semaphore_signal log: 2.模拟下载任务下载20...

  • 【多线程】NSOperation<二>

    (1)并发数:同时执⾏行的任务数.比如,同时开3个线程执行3个任务,并发数就是3 (2)最大并发数:同一时间最多只...

  • 多线程

    多线程 多线程 一个进程里面可以开启多条线程,每条线程可以并行(同时)执行不同的任务比如同时开启三条线程分别下载三...

  • iOS多线程之NSThread

    相关文章:iOS多线程之GCDiOS多线程之NSOperations 案例1--图片下载 案例2--多售票窗口同时...

  • iOS多任务下载的简要概述

    多任务下载顾名思义就是多个任务同时下载,各个任务在同一时间一起下载,比如迅雷等下载软件就具备这些功能,而iOS开发...

  • 并发和并行

    并发:指应用能够交替执行不同的任务,其实并发有点类似于多线程的原理,多线程并非是同时执行多个任务,如果你开两个线程...

  • GCD之函数与队列初探

    一、前言 在iOS开发过程中,我们知道多线程技术是使用最多的情况,能快速的执行多个调度任务的执行。而在多线程开发过...

  • HTTP的多线程下载

    多线程下载是加快下载速度的一种方式,通过开启多个线程去执行一个任务,可以使任务的执行速度变快。多线程的任务下载时常...

  • OS开发多线程篇—NSOperation基本操作

    一、并发数 (1)并发数:同时执⾏行的任务数.比如,同时开3个线程执行3个任务,并发数就是3 (2)最大并发数:同...

  • 浏览器加载页面顺序

    1。下载html代码 2。解析html代码,同时开新线程去下载css代码和js代码 3。根据html代码生成dom...

网友评论

    本文标题:iOS 100个下载任务,最多同时开5个线程。

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