美文网首页
Swift 5.x 多线程其他模式

Swift 5.x 多线程其他模式

作者: ShenYj | 来源:发表于2020-07-11 22:35 被阅读0次

    • Promise
    • Pipeline
    • Master-Slave
    • Serial Thread Confinement

    Promise:

    所谓Promise, 就是一个对象, 用来传递异步操作的消息. 它代表了某个未来才会知道结果的事件(通常是一个异步操作), 并且这个事件提供统一的API, 可供进一步处理.

    对象的状态不受外界影响. Promise对象代表一个异步操作, 有三种状态:
    Pending(进行中)又称Incomplete
    Resolved(已完成)又称Fulfilled
    Rejected(已失败)
    只有异步操作的结果, 可以决定当前是哪一种状态, 任何其他操作都无法改变这个状态. 这也是Promise这个名字的由来, 他的英语意思就是承诺, 表示其他手段无法改变.

    一旦状态改变, 就不会再变, 任何时候都可以得到这个结果. Promise对象的状态改变, 只有两种可能:
    Pending变为Resolved和从Pending变为Rejected.
    只要这两种情况发生, 状态就凝固了, 不会再变了, 会一直保持这个结果.就算改变已经发生了, 你再对Promise对象添加回调函数, 也会立即得到这个结果. 这与事件(Event)完全不同, 事件的特点是, 如果你错过了它, 再去监听, 是得不到结果的.

    案例: 两个操作先后依赖, 第二个网络请求需要第一个网络请求的返回值currentUser作为参数

    APIClient.fetchCurrentUser(success: { currentUser in
        APIClinet.fetchFollowers(user: currentUser, success: { followers in
            // 得到一个flowwers 数组
        }, failure: { error in
            // 错误处理
        })
    }, failure: { error in
        // 错误处理
    })
    

    弊端:

    • 在需要多个操作的时候, 会导致多个回调函数嵌套, 导致代码不够直观, 就是常说的Callback Hell
    • 如果几个异步操作之间并没有前后顺序之分(例如不需要前一个请求的结果作为后一个请求的参数)时, 同样需要等待上一个操作完成再实行下一个操作.
    • 丧失了return特性.

    使用Promise优化后:

    APIClient.fetchCurrentUser()
        .then({ currentUser in
            return APIClient.fetchFollowers(user: currentUser)
        })
        .then({ followers in
            // you now have an array of followers
        })
        .onFailure({ error in
            // hooray, a single failure block!
        })
    

    自己在OC中没有这种使用经历, 在RN开发中有使用过, 的确很好的解决了回调地狱的问题


    Pipeline:

    将一个任务分解为若干个阶段(Stage), 前阶段的输出为下阶段的输入, 各个阶段由不同的工作者线程负责执行.
    各个任务的各个阶段是并行(Parallel)处理的
    具体任务的处理是串行的, 即完成一个任务要依次执行各个阶段, 但从整体任务上看, 不同任务的各个阶段的执行时并行的.

    Pipeline

    Master-Slave :

    将一个任务分解为若干个语义等同的子任务, 并由专门的工作者线程来并行执行这些子任务, 既提高计算效率, 又实现了信息隐藏.


    Master-Slave

    Serial Thread Confinement:

    如果并发任务的执行涉及某个非线程安全对象, 而很多时候我们又不希望因此而引入锁.
    通过将多个并发的任务存入队列实现任务的串行化, 并未这些串行化任务创建唯一的工作者线程进行处理.

    相关文章

      网友评论

          本文标题:Swift 5.x 多线程其他模式

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