gpt4 book ai didi

ios - 如何创建队列并手动启动它

转载 作者:行者123 更新时间:2023-12-02 05:18:02 25 4
gpt4 key购买 nike

在我的应用程序中,我必须实现刷新 token 逻辑。我希望在刷新 token 过程中发送的所有请求都保留在队列中,并且一旦我的过程完成,我就启动队列

例如,我想要这样的东西:

let queue = DispatchQueue(label: "myQueue", attributes: .concurrent)  

queue.async {
// request One
}

queue.async {
// request Two
}

当刷新 token 过程完成时:

queue.send()

最佳答案

In my application I have to implement a refresh token logic. I would like that during the refresh token process all requests sent be kept in a queue and as soon as my process is finished I start the queue

如果你想创建一个队列并延迟其任务的启动,只需将其挂起即可,例如:

let queue = DispatchQueue(label: "myQueue", attributes: .concurrent)  
queue.suspend()

queue.async {
// request One
}

queue.async {
// request Two
}

fetchToken { result in
switch result {
case .success(let token):
// do something with token
print(token)
queue.resume()

case .failure(let error):
// handle the error
print(error)
}
}

这就是你 suspendresume调度队列。请注意,挂起仅阻止项目在队列上启动,但对已在运行的任务没有影响。这就是为什么我在向队列分派(dispatch)项目之前暂停队列的原因。

但是上面的内容引出了一个问题:在这种失败场景中您想要做什么。你只是有一个队列,里面有一堆计划任务。理论上,您可以保留对这些分派(dispatch) block 的引用(通过使用 DispatchWorkItem 模式而不仅仅是简单的闭包,并且您可以取消这些项目),但我可能会达到对于操作队列,例如

let queue = OperationQueue()
queue.isSuspended = true

queue.addOperation {
// request One
}

queue.addOperation {
// request Two
}

fetchToken { result in
switch result {
case .success(let token):
// do something with token
print(token)
queue.isSuspended = false

case .failure(let error):
// handle the error
print(error)
queue.cancelAllOperations()
}
}

这与上面的相同,但是我们可以使用 cancelAllOperations 取消所有这些排队操作。 .

<小时/>

顺便说一句,您可以创建自定义Operation 子类来处理本身异步的任务。我假设您的“请求一”和“请求二”是异步网络请求。请参阅looking for a specific example where Operation is preferred over GCD or vice-versa讨论何时人们可能更喜欢 OperationQueue 而不是 DispatchQueue

关于ios - 如何创建队列并手动启动它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59552305/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com