修复token获取异常的问题
This commit is contained in:
parent
06122c3142
commit
e1840a4fdb
@ -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
|
||||||
|
@ -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?()
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user