使用组合网络刷新令牌 ios

refresh token using combine networking ios

这个问题很简单:

我的代码:

        return urlSession.dataTaskPublisher(for: urlRequest)
        .tryMap { (data: Data, response: URLResponse) -> Data in
            //TODO: hide loader
            GRP.hideLoader()
            if let httpURLResponse = response as? HTTPURLResponse {
                if !(200...299 ~= httpURLResponse.statusCode) {
                    var error = NetworkingError(errorCode: httpURLResponse.statusCode)
                    if let json = try? JSONSerialization.jsonObject(with: data, options: []) {
                        error.jsonPayload = json
                    }
                    throw error
                }
            }
            
            if withErrorMessage, let errorCheckModel = try? JSONDecoder().decode(ErrorModel.self, from: data)
            {
                if let statusIsSuccess = errorCheckModel.success, let errorMessage = errorCheckModel.message, !errorMessage.isEmpty
                {
                    if(!statusIsSuccess)
                    {
                        print(urlString)
                        GRP.showToast(failure: true, message: errorMessage)
                    }
                }
            }

            
            return data
        }.mapError { error -> NetworkingError in
            return NetworkingError(error: error)
        }
        .decode(type: T.self, decoder: decoder)
        .receive(on: RunLoop.main)
        .eraseToAnyPublisher()
}

我完成了这个任务,但我卡住了,我想知道如何实现刷新令牌 i。谢谢。

这个问题写得有点混乱。你的意思是我有一个 returns 一个 AnyPublisher<SomeDecodable, NetworkError> 的请求,如果它由于特定原因而失败,那么我想再次调用(刷新)然后重试该请求?如果是这样,它看起来像这样:

  let authenticatedRequest = URLSession.shared.dataTaskPublisher(for: urlRequest)
  return authenticatedRequest
    .map { (data, response) -> AnyPublisher<(Data, URLResponse), Error> in
      isUnanthenticated(response)
        ? refetchToken.map { _ in
            authenticatedRequest
          }
          .switchToLatest()
          .eraseToAnyPublisher()
        : Just((data, response)).eraseToAnyPublisher()
      }
    .switchToLatest()
    .decode(T.self, from: decoder)
    .mapError { error -> NetworkingError in
       return NetworkingError(error: error)
    }
    .eraseToAnyPublisher()
  }
    
  1. 我们发出经过身份验证的请求
  2. 我们映射请求,如果失败则我们重新请求并重试。否则我们只是 return 输出输入。
  3. 无论哪种方式,我们现在都有一个 Publisher of Publishers,我们不希望这样,所以我们调用 switch to latest 来展平它,然后我们继续。