PromiseKit提供了一个方便的方法thenOn,用于在非主线程上运行链的各个部分。然而,似乎没有任何方便的方法来设置第一个promise执行线程。
这意味着我最终要么在第一个promise中放置一个DispatchQueue.global(x).async,要么使用一个虚拟的第一个promise。
将DispatchQueue比特放在我的第一个promise中感觉被打破了,我将线程决策从主执行链转移到单个promise,但只为了这一个promise。如果我后来在我的链中添加了一个承诺,我必须移动所有的线程逻辑……不太好。
我最近做的事情是这样的:
let queue = DispatchQueue.global(qos: .userInitiated)
Promise(value: ()).then(on: queue) {
// Now run first promise function
}这绝对是一个更干净的解决方案,但我想知道是否有人知道更好的解决方案……我敢肯定这不是一个罕见的情况?
发布于 2017-11-28 05:07:51
我们提供:
DispatchQueue.global().promise {
//…
}firstly不接受队列,因为在默认情况下它会立即执行它的内容,因此允许它有一个已配置的队列会使它的行为变得令人困惑。
更新:在最新版本中它看起来像
DispatchQueue.global().async(.promise) {
//...
}发布于 2017-10-01 15:41:09
您可以对任何队列执行操作,只需从队列调用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()
}
}
}https://stackoverflow.com/questions/46490921
复制相似问题