修复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 { class SPNetwork: NSObject {
/// ///token线
private static var awaitDataArr: [Any] = [] private static let operationQueue = OperationQueue()
private static var tokenOperation: BlockOperation?
private static var group = DispatchGroup()
private static var queue: DispatchQueue = DispatchQueue(label: "bcRequestQueue", attributes: .concurrent)
static let semaphore = DispatchSemaphore(value: 1) // 1
static let provider = MoyaProvider<SPApi>(requestClosure: CustomApiTimeoutClosure) static let provider = MoyaProvider<SPApi>(requestClosure: CustomApiTimeoutClosure)
static func request<T>(parameters: SPNetworkParameters, completion: ((_ response: SPNetworkResponse<T>) -> Void)?) { static func request<T>(parameters: SPNetworkParameters, completion: ((_ response: SPNetworkResponse<T>) -> Void)?) {
if SPLoginManager.manager.token == nil { 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 if let tokenOperation = self.tokenOperation, parameters.path != "/customer/register" {
while loding {
if !SPLoginManager.manager.isRefreshingToken { let requestOperation = BlockOperation {
loding = false let semaphore = DispatchSemaphore(value: 0)
spLog(message: "======等待结束") _request(parameters: parameters) { (response: SPNetworkResponse<T>) in
} else { semaphore.signal()
spLog(message: "======等待中") 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 @discardableResult
@ -70,31 +71,45 @@ class SPNetwork: NSObject {
case .success(let response): case .success(let response):
let code = response.statusCode let code = response.statusCode
if code == 401 || code == 402 || code == 403 { 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 { if let tokenOperation = self.tokenOperation, parameters.path != "/customer/register" {
SPLoginManager.manager.requestVisitorLogin {
if let _ = SPLoginManager.manager.token { let requestOperation = BlockOperation {
self.request(parameters: parameters, completion: completion) let semaphore = DispatchSemaphore(value: 0)
_request(parameters: parameters) { (response: SPNetworkResponse<T>) in
semaphore.signal()
completion?(response)
} }
semaphore.wait()
} }
} else { ///
if parameters.path != "/customer/register" { requestOperation.addDependency(tokenOperation)
// while SPLoginManager.manager.isRefreshingToken {
// RunLoop.current.run(mode: .default, before: Date.distantFuture) operationQueue.addOperation(requestOperation)
// } }
// if !SPLoginManager.manager.isRefreshingToken {
// SPLoginManager.manager.requestVisitorLogin {
// if let _ = SPLoginManager.manager.token { // if let _ = SPLoginManager.manager.token {
// self.request(parameters: parameters, completion: completion) // 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 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 { extension MoyaProvider {
@discardableResult @discardableResult

View File

@ -34,15 +34,13 @@ extension SPLoginManager {
/// ///
func requestVisitorLogin(completer: (() -> Void)?) { func requestVisitorLogin(completer: (() -> Void)?) {
if isRefreshingToken { if isRefreshingToken {
completer?()
return return
} }
isRefreshingToken = true 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 } guard let self = self else { return }
if let token = response.data {
self.setLoginToken(token: token)
}
self.isRefreshingToken = false self.isRefreshingToken = false
completer?() completer?()
} }