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

Concurrent queue并行处理任务

作者: 醉看红尘这场梦 | 来源:发表于2019-12-20 13:20 被阅读0次

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

image

作为一个队列,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

其中,高优先级队列中的任务,会先于低优先级队列中的任务被执行。接下来,我们就把之前在serial queue中下载图片的例子,放到concurrent queue中完成。


使用默认的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(self.imageUrls[0])
    dispatch_async(dispatch_get_main_queue(), {
        self.image1.image = img1
        self.image1.clipsToBounds = true
    })
})

dispatch_async(currQueue, {
    let img2 = Downloader.downloadImageWithURL(self.imageUrls[1])
    dispatch_async(dispatch_get_main_queue(), {
        self.image2.image = img2
        self.image2.clipsToBounds = true
    })
})

dispatch_async(currQueue, {
    let img3 = Downloader.downloadImageWithURL(self.imageUrls[2])
    dispatch_async(dispatch_get_main_queue(), {
        self.image3.image = img3
        self.image3.clipsToBounds = true
    })
})

dispatch_async(currQueue, {
    let img4 = Downloader.downloadImageWithURL(self.imageUrls[3])
    dispatch_async(dispatch_get_main_queue(), {
        self.image4.image = img4
        self.image4.clipsToBounds = true
    })
})

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


自定义并行队列

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


let currQueue = dispatch_queue_create("com.boxueio.images", DISPATCH_QUEUE_CONCURRENT)

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


相关文章

  • Concurrent queue并行处理任务

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

  • Concurrent queue并行处理任务

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

  • iOS-OC-易错代码

    1.下面代码会发生什么问题 会crash。因为在并行队列DISPATCH_QUEUE_CONCURRENT中异步d...

  • GCD简单使用

    队列类型 并发队列(Concurrent Dispatch Queue)任务并发(同步)执行 串行队列(Seria...

  • Dispatch Queue

    queue types Serial Concurrent Main dispatch queue Queue-R...

  • iOS 多线程

    GCD的队列可以分为2大类型 并发队列(Concurrent Dispatch Queue) 可以让多个任务并发(...

  • 第三章 3.2.7 dispatch_barrier_async

    为高效的访问,读取处理追加到Concurrent Dispatch Queue,写入处理在任何一个读取操作都没有执...

  • GCD 与线程的关系及常用操作

    dispatch queue 串行队列(DISPATCH_QUEUE_CONCURRENT)serial disp...

  • 通俗易懂GCD

    Dispatch Queue(调度队列) Serial Dispatch Queue串行代码;Concurrent...

  • GCD回顾

    GCD的API DISPATCH_QUEUE_SERIAL / DISPATCH_QUEUE_CONCURRENT...

网友评论

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

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