iOS取经之路

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

2018-09-05  本文已影响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 信号量一节

上一篇下一篇

猜你喜欢

热点阅读