修复token获取异常的问题

This commit is contained in:
曾觉新 2025-04-18 09:48:03 +08:00
parent 06122c3142
commit e1840a4fdb
2 changed files with 80 additions and 41 deletions

View File

@ -14,35 +14,36 @@ let SPNetworkCodeSucceed = 200
class SPNetwork: NSObject {
///
private static var awaitDataArr: [Any] = []
private static var group = DispatchGroup()
private static var queue: DispatchQueue = DispatchQueue(label: "bcRequestQueue", attributes: .concurrent)
static let semaphore = DispatchSemaphore(value: 1) // 1
///token线
private static let operationQueue = OperationQueue()
private static var tokenOperation: BlockOperation?
static let provider = MoyaProvider<SPApi>(requestClosure: CustomApiTimeoutClosure)
static func request<T>(parameters: SPNetworkParameters, completion: ((_ response: SPNetworkResponse<T>) -> Void)?) {
if SPLoginManager.manager.token == nil {
SPLoginManager.manager.requestVisitorLogin(completer: nil)
self.requestToken(completer: nil)
}
if SPLoginManager.manager.isRefreshingToken && parameters.path != "/customer/register" {
var loding = true
while loding {
if !SPLoginManager.manager.isRefreshingToken {
loding = false
spLog(message: "======等待结束")
} else {
spLog(message: "======等待中")
if let tokenOperation = self.tokenOperation, parameters.path != "/customer/register" {
let requestOperation = BlockOperation {
let semaphore = DispatchSemaphore(value: 0)
_request(parameters: parameters) { (response: SPNetworkResponse<T>) in
semaphore.signal()
completion?(response)
}
RunLoop.current.run(mode: .default, before: Date.distantFuture)
semaphore.wait()
}
///
requestOperation.addDependency(tokenOperation)
operationQueue.addOperation(requestOperation)
} else {
_request(parameters: parameters, completion: completion)
}
spLog(message: "======开始请求")
_request(parameters: parameters, completion: completion)
}
@discardableResult
@ -70,31 +71,45 @@ class SPNetwork: NSObject {
case .success(let response):
let code = response.statusCode
if code == 401 || code == 402 || code == 403 {
// var data = SPNetworkData<T>()
// data.parameters = parameters
// data.completion = completion
//
// awaitDataArr.append(data)
// awaitDataArr.first as? SPNetworkData<T>
///token
self.requestToken(completer: nil)
if !SPLoginManager.manager.isRefreshingToken {
SPLoginManager.manager.requestVisitorLogin {
if let _ = SPLoginManager.manager.token {
self.request(parameters: parameters, completion: completion)
///
if let tokenOperation = self.tokenOperation, parameters.path != "/customer/register" {
let requestOperation = BlockOperation {
let semaphore = DispatchSemaphore(value: 0)
_request(parameters: parameters) { (response: SPNetworkResponse<T>) in
semaphore.signal()
completion?(response)
}
semaphore.wait()
}
} else {
if parameters.path != "/customer/register" {
// while SPLoginManager.manager.isRefreshingToken {
// RunLoop.current.run(mode: .default, before: Date.distantFuture)
// }
///
requestOperation.addDependency(tokenOperation)
operationQueue.addOperation(requestOperation)
}
// if !SPLoginManager.manager.isRefreshingToken {
// SPLoginManager.manager.requestVisitorLogin {
// if let _ = SPLoginManager.manager.token {
// self.request(parameters: parameters, completion: completion)
// }
}
}
// }
// } else {
// if parameters.path != "/customer/register" {
//// while SPLoginManager.manager.isRefreshingToken {
//// RunLoop.current.run(mode: .default, before: Date.distantFuture)
//// }
//// if let _ = SPLoginManager.manager.token {
//// self.request(parameters: parameters, completion: completion)
//// }
// }
// }
return
}
@ -162,6 +177,32 @@ class SPNetwork: NSObject {
}
extension SPNetwork {
///token
static func requestToken(completer: ((_ token: SPTokenModel?) -> Void)?) {
guard self.tokenOperation == nil else {
completer?(nil)
return
}
self.tokenOperation = BlockOperation(block: {
let semaphore = DispatchSemaphore(value: 0)
let param = SPNetworkParameters(path: "/customer/register")
SPNetwork.request(parameters: param) { (response: SPNetworkResponse<SPTokenModel>) in
if let token = response.data {
SPLoginManager.manager.setLoginToken(token: token)
}
do { semaphore.signal() }
self.tokenOperation = nil
completer?(response.data)
}
semaphore.wait()
})
operationQueue.addOperation(self.tokenOperation!)
}
}
extension MoyaProvider {
@discardableResult

View File

@ -34,15 +34,13 @@ extension SPLoginManager {
///
func requestVisitorLogin(completer: (() -> Void)?) {
if isRefreshingToken {
completer?()
return
}
isRefreshingToken = true
let param = SPNetworkParameters(path: "/customer/register")
SPNetwork.request(parameters: param) { [weak self] (response: SPNetworkResponse<SPTokenModel>) in
SPNetwork.requestToken { [weak self] token in
guard let self = self else { return }
if let token = response.data {
self.setLoginToken(token: token)
}
self.isRefreshingToken = false
completer?()
}