gpt4 book ai didi

Swift:带有完成处理程序的多线程

转载 作者:搜寻专家 更新时间:2023-11-01 05:33:41 26 4
gpt4 key购买 nike

我有一个访问关键变量的函数,需要互斥访问它,但通过完成处理程序返回。

这是我目前用来尝试的:

static func getAccessTokenValue(completionHandlerResult : @escaping (_ accesstoken:String) -> ()) {
tokenQ.sync {
let expire_in_str = UserDefaults.standard.value(forKey: "expires_in") as! String
print(expire_in_str)
let accessToken_time = UserDefaults.standard.value(forKey: "access_token_time") as! Date

let todayDate = Date()
let seconds = (Calendar.current as NSCalendar).components(.second, from: accessToken_time, to: todayDate, options: []).second
if seconds! < Int(5) {
print("success")
completionHandlerResult( Constants.Access_Token)
}
else {
refreshLock.wait()
self.renewAccessToken(completionHandler: { accesstokenValue in
tokenQ.sync {
completionHandlerResult(accesstokenValue)
}
})
refreshLock.signal()
}
}
}

目标是一次只有一个线程能够使用self.renewAccessToken。单独使用 DispatchQueue.sync 无法完成此操作,因此我转向信号量,但上面的代码导致死锁,因为 refreshLock.signal() 似乎没有效果。

self.renewAccessToken 使用 alamofire 并在其中有另一个完成处理程序,这增加了线程问题。

我遇到的主要问题是多个线程正在尝试同时更新同一个 token ,一旦一个线程更新了 token ,其他线程将保留旧 token 并且它们的更新请求被拒绝,因为 token 只能是更新一次。

处理这种情况的最佳方法是什么?

最佳答案

试试这个:

static func getAccessTokenValue(completionHandlerResult : @escaping (_ accesstoken:String) -> ()) {
tokenQ.sync {
let expire_in_str = UserDefaults.standard.value(forKey: "expires_in") as! String
let accessToken_time = UserDefaults.standard.value(forKey: "access_token_time") as! Date

let todayDate = Date()
let seconds = (Calendar.current as NSCalendar).components(.second, from: accessToken_time, to: todayDate, options: []).second
if seconds! < Int(5) {
completionHandlerResult( Constants.Access_Token)
}
else {
refreshLock.wait()
self.renewAccessToken(completionHandler: { accesstokenValue in
completionHandlerResult(accesstokenValue)
})
refreshLock.signal()
}
}
}

关于Swift:带有完成处理程序的多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47437569/

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