IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    Swift 3 里的 GCD

    R0uter发表于 2016-09-15 07:39:37
    love 0

    去落格博客阅读完整排版的Swift 3 里的 GCD

    Xcode 8 正式版已经发布,我要在第一时间迁移我的项目到 Swift 3 —— 毕竟这是趋势。

    在迁移的过程当中我遇到了很多问题——比如 Xcode 提供的自动迁移工具根本没有用,在我等待了两个多小时之后,我放弃了,选择手动迁移——毕竟,Xcode 的自动更正也是很好用的。

    然而——在迁移过程当中,Xcode 一直处在 “indexing” 中,功能也不怎么全……可能是由于 Swift 3 在演进的过程当中进行了多次语法的修改,所以很多地方的语法都是来回地修改——最终的结果就是变成一个无法自动更正的错误。

    好吧,最终还是得手动来修改,所以这里来记录一下最常用的 GCD 的更改内容。

    DispatchQueue

    首先,dispatch 的全局函数不再写为下划线风格的名称了,它变成了一个更符合 Swift 风格的 DispatchQueue 的样子。

    main thread

    同样的,你不需要在去用

    dispatch_get_main_queue()
     来获取主线程,而是
    DispatchQueue.main
     ,那么要放到主线程的代码怎么执行呢?只需要在线程后边使用
    .async {}
     即可,也就是说,大概是这样:

    DispatchQueue.main.async { [weak self] in
          your code runs in main thread
    }

    而实际上,现在的 Xcode 的自动补全,是错误的

    .asynchronously()
     。

    另:在目前的所有测试中,我发现所有写在这个闭包里的代码都不会被执行——求帮助求解答,如果这是个bug……我的所有项目还是继续使用 Swift 2.3 好了。

    优先级

    说完了最基本的东西,我们再来说说其他改变了的东西,比如优先级的名字。

    我们知道,GCD 的默认队列优先级有四个:

    • DISPATCH_QUEUE_PRIORITY_HIGH
    • DISPATCH_QUEUE_PRIORITY_DEFAULT
    • DISPATCH_QUEUE_PRIORITY_LOW
    • DISPATCH_QUEUE_PRIORITY_BACKGROUND

    现在,新的语法当中,改变了这四个不明不白的优先级名称为更有意义的名字:

    • .userInitialted
    • .default
    • .utility
    • .background

    当然,它们的对应关系也就是与顺序相同的:

    DISPATCH_QUEUE_PRIORITY_HIGH:         .userInitiated
     DISPATCH_QUEUE_PRIORITY_DEFAULT:      .default
     DISPATCH_QUEUE_PRIORITY_LOW:          .utility
     DISPATCH_QUEUE_PRIORITY_BACKGROUND:   .background

    获取一个队列

    我们使用

    DispatchQueue.global()
     获取一个系统的队列,这样的话获取的就是默认
    .default
     优先级的队列了,如果要获取其他优先级的队列,就使用
    DispatchQueue.global(qos: .userInitiated)
     ,最后,我们使用
    .async {}
     来执行代码:

    DispatchQueue.global(qos: .userInitiated).async {
                //your code here
            }

    创建一个队列

    直接用

    DispatchQueue
     的初始化器来创建一个队列。最简单直接的办法是这样:

    let queue = DispatchQueue(label: "myBackgroundQueue")

    复杂一点?你可以指定优先级以及队列类别:

    let queue = DispatchQueue(label: "myBackgroundQueue", qos: .userInitiated, attributes: .concurrent)

    然后把代码放进去即可:

    queue.async {
        print("aaa")
    }

    队列打组

    对于组,现在你可以使用这样的语法直接创建一个组:

    let group = DispatchGroup()

    至于使用,则是这样的:

    let group = DispatchGroup()
    
    let queue = DispatchQueue(label: "myBackgroundQueue")
    
    queue.async(group:group) {
        print("background working")
    }

    那么,如果有多个并发队列在同一个组里,我们需要它们完成了再继续呢?

    group.wait()

    指定时间后执行

    很多时候你可能还需要让一些代码在指定的时间后执行,比如动画完成后。这个任务在swift 2.3 很麻烦,不过,在3.0就不一样了:

    DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 3.0) {
        print("after!")
    }

    只需要一句话即可。

    Swift 3 里的 GCD,首发于落格博客。

    其他推荐:
    1. Swift 如何像 C语言 那样接收入口参数?
    2. Swift 开发者的 SDK
    3. Swift 里的 单件模式
    4. Swift 是开源的
    5. 在 Swift 里使用 SQLite 数据库



沪ICP备19023445号-2号
友情链接