PromiseKit firstlyOn 样式方法

Posted

技术标签:

【中文标题】PromiseKit firstlyOn 样式方法【英文标题】:PromiseKit firstlyOn style method 【发布时间】:2017-09-29 14:25:05 【问题描述】:

PromiseKit 提供了一种方便的方法thenOn 用于在非主线程上运行部分链。但是似乎没有任何方便的方法来设置第一个承诺执行线程。

这意味着我最终要么在我的第一个承诺中放置一个DispatchQueue.global(x).async,要么我使用一个虚拟的第一个承诺。

在我的第一个承诺中放置 DispatchQueue 位感觉很糟糕,我正在将线程决策从主执行链转移到单个承诺,但只是为了那个承诺。如果我稍后在我的链中添加一个承诺,我必须移动所有的线程逻辑......不好。

我最近一直在做的是:

    let queue = DispatchQueue.global(qos: .userInitiated)

    Promise(value: ()).then(on: queue) 

        // Now run first promise function

    

这绝对是一个更清洁的解决方案,但我想知道是否有人知道 更好的解决方案...我敢肯定这毕竟不是罕见的情况?

【问题讨论】:

【参考方案1】:

我们提供:

DispatchQueue.global().promise 
    //…

firstly 不采用队列,因为它在默认情况下立即执行其内容,因此允许它具有已配置的队列会使其行为易变易变。

更新:在最新版本中看起来像

DispatchQueue.global().async(.promise)   
    //...          

【讨论】:

【参考方案2】:

您可以对任何队列执行操作,只需从中调用fulfillreject

看例子:

override func viewDidLoad() 
    super.viewDidLoad()

    firstly 
        doFirstly()
        
        .then 
            self.doMain()
        
        .then 
            self.doLastest()
        
        .catch  error in
            // handle error
        
        .always 
            // finish
    


func doFirstly() -> Promise<Void> 
    return Promise  fulfill, reject in
        let queue = DispatchQueue.global(qos: .userInitiated)
        queue.async 
            // do your operation here
            fulfill()
        
    


func doMain() -> Promise<Void> 
    return Promise  fulfill, reject in
        let queue = DispatchQueue.main
        queue.async 
            // do your operation here
            fulfill()
        
    


func doLastest() -> Promise<Void> 
    return Promise  fulfill, reject in
        let queue = DispatchQueue.global(qos: .userInitiated)
        queue.async 
            // do your operation here
            fulfill()
        
    

【讨论】:

以上是关于PromiseKit firstlyOn 样式方法的主要内容,如果未能解决你的问题,请参考以下文章

PromiseKit 手动安装

使用 PromiseKit 和 Alamofire 时跟踪进度

PromiseKit 框架 - 对成员“then()”的模糊引用

PromiseKit 是不是有 RxSwift Zip 替代方案?

PromiseKit 6 中 firstly 的合成器

PromiseKit O-C 指南