修复token获取异常的问题
This commit is contained in:
parent
06122c3142
commit
e1840a4fdb
@ -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 let tokenOperation = self.tokenOperation, parameters.path != "/customer/register" {
|
||||
|
||||
if !SPLoginManager.manager.isRefreshingToken {
|
||||
SPLoginManager.manager.requestVisitorLogin {
|
||||
if let _ = SPLoginManager.manager.token {
|
||||
self.request(parameters: parameters, completion: completion)
|
||||
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
|
||||
|
@ -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?()
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user