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】:您可以对任何队列执行操作,只需从中调用fulfill
或reject
看例子:
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 和 Alamofire 时跟踪进度
PromiseKit 框架 - 对成员“then()”的模糊引用