diff --git a/ShortPlay/Base/Networking/Base/SPNetwork.swift b/ShortPlay/Base/Networking/Base/SPNetwork.swift index eac6053..25ed568 100644 --- a/ShortPlay/Base/Networking/Base/SPNetwork.swift +++ b/ShortPlay/Base/Networking/Base/SPNetwork.swift @@ -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(requestClosure: CustomApiTimeoutClosure) static func request(parameters: SPNetworkParameters, completion: ((_ response: SPNetworkResponse) -> 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) 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() -// data.parameters = parameters -// data.completion = completion -// -// awaitDataArr.append(data) -// awaitDataArr.first as? SPNetworkData + ///重新获取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) 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) 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 diff --git a/ShortPlay/Libs/Login/SPLoginManager.swift b/ShortPlay/Libs/Login/SPLoginManager.swift index 85c45ff..5f03d45 100644 --- a/ShortPlay/Libs/Login/SPLoginManager.swift +++ b/ShortPlay/Libs/Login/SPLoginManager.swift @@ -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) 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?() }