美文网首页
Concurrent queue并行处理任务

Concurrent queue并行处理任务

作者: 玉米地里种玉米 | 来源:发表于2019-03-14 14:39 被阅读0次

    除了在队列中串行执行任务,iOS还为每一个app默认提供了4个可以并行执行任务的队列,它们叫做concurrent queue

    作为一个队列,concurrent queue中的任务也按照进入队列的顺序“启动”,但是,和serial queue不同,它们不用等待之前的任务完成,iOS会根据系统资源的情况启动多个线程并行执行队列中的任务。

    每一个app默认拥有的concurrent queue分成4个不同的优先级,由高到低分别是:

    DISPATCH_QUEUE_PRIORITY_HIGH
    DISPATCH_QUEUE_PRIORITY_DEFAULT
    DISPATCH_QUEUE_PRIORITY_LOW
    DISPATCH_QUEUE_PRIORITY_BACKGROUND

    其中,高优先级队列中的任务,会先于低优先级队列中的任务被执行。

    使用默认的Concurrent Queue

    我们使用dispatch_get_global_queue函数读取系统默认的concurrent queue:

    var currQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
    

    其中第一个参数表示我们要获取的队列的优先级。然后,使用dispatch_async把下载任务“派遣”到队列里:

    dispatch_async(currQueue, {
        let img1 = Downloader.downloadImageWithURL("http://.../1.jpg")
        dispatch_async(dispatch_get_main_queue(), {
            /// 更新主线程UI
        })
    })
    dispatch_async(currQueue, {
        let img2 = Downloader.downloadImageWithURL("http://.../1.jpg")
        dispatch_async(dispatch_get_main_queue(), {
            /// 更新主线程UI
        })
    })
    .
    .
    .
    
    dispatch_async(currQueue, {
        let img4 = Downloader.downloadImageWithURL("http://.../1.jpg")
        dispatch_async(dispatch_get_main_queue(), {
            /// 更新主线程UI
        })
    })
    

    然后Command + R编译执行,就可以看到同一个concurrent queue中所有的任务在并行下载了。

    自定义并行队列

    除了iOS默认提供的concurrent queue,我们也自己创建处理特定任务的并行队列,这和我们自定义serial queue是类似的:

    let currQueue = dispatch_queue_create("imagesDownLoad", DISPATCH_QUEUE_CONCURRENT)
    

    第一个参数表示并行队列的名字,第二参数表示我们要创建一个并行队列。然后Command + R重新编译执行,我们的图片就在自己创建的并行队列中下载了。

    我们介绍了concurrent queue,在iOS中叫做Grand Central Dispatch,它是一组相对低层的C语言API。尽管GCD对线程管理进行了封装,如果我们要管理队列中的任务(例如:查看任务状态、取消任务、控制任务之间的执行顺序等)仍然不是很方便。

    相关文章

      网友评论

          本文标题:Concurrent queue并行处理任务

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