为了在结帐过程中与后端通信,我具有异步功能:
create():在后端创建购物车。当用户选择结帐页面时调用。
update():在后端编辑购物车。当用户编辑购物车时调用。
confirm():确认在后端购买。当用户下订单时调用。
update()依赖于 create()的响应, confirm()依赖于 create()的响应 / update()
用户可以调用一个功能,而另一个功能未完成,例如,在搜索到结帐页面后不久即可编辑购物车。由于依赖关系,这会导致问题。
我目前已经通过使用 processing , shouldUpdate 和 shouldConfirm 这些布尔变量来半解决它。
是否有一种方法可以通过使用队列来完成,在该队列中下一个函数调用要等到上一个函数调用完成为止?
var processing = false // Set true when a function is executing
var shouldUpdate = false // Set true when user edits cart
var shouldConfirm = false // Set true when user taps "Purchase"
var checkoutID = ""
func create() {
processing = true
APIClient.sharedClient.createShoppingCart() {
(checkoutID, error) in
...
processing = false // Finished with network call
if shouldUpdate { // if edit was done while create() is running
update()
shouldUpdate = false
}
if shouldConfirm { // if user tapped "Purchase" while create() is running
confirm()
}
}
}
func update() { // Called from view controller or create()
if processing {return}
processing = true
APIClient.sharedClient.updateShoppingCart(forCheckoutID: checkoutID) {
(error) in
...
processing = false // Finished with network call
if shouldConfirm { // if user tapped "Purchase" while update() is running
confirm()
}
}
}
func confirm() { // Called from view controller or create()/update()
if processing {return}
APIClient.sharedClient.confirmPurchase(forCheckoutID: checkoutID) {
(error) in
...
/// Finish order process
}
}
答案 0 :(得分:1)
我个人使用 PromiseKit -不错的文章generally here,用async here包装-和how to promises here
// your stack
var promises = [];
// add to your stack
promises.push(promise); // some promise func, see above links
promises.push(promise2);
// work the stack
when(fulfilled: promiseArray).then { results in
// Do something
}.catch { error in
// Handle error
}
类似解决方案的关键字:Promises,Deferred,Async Stacks。
或: 您可以实现以下内容:
有一个池,一组数组:methodhandler和bool(=执行为true)
创建一个func(1)在另一个包装函数(2)中运行数组中的所有func,该函数将在执行时设置tupels bool。
func(1)会等到更换教堂之后,再抓取下一个。
答案 1 :(得分:1)
您可以使用调度组
let apiDispatchGroup = DispatchGroup()
func asyncCall1() {
apiDispatchGroup.enter()
print("Entered")
DispatchQueue.main.asyncAfter(deadline: .now()+3) {
/// After 3 Second it will notify main Queue
print("Task 1 Performmed")
/// Let's notify
apiDispatchGroup.leave()
}
apiDispatchGroup.notify(queue: .main) {
/// Perform task 2
asyncCall2()
}
}
func asyncCall2() {
print("Task 2")
}