使用组合网络 ios 刷新令牌

Gha*_*zri 0 ios swift refresh-token swiftui combine

这个问题很简单:

我的代码:

        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()
}
Run Code Online (Sandbox Code Playgroud)

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

Jos*_*ann 7

这个问题写得有点令人困惑。您的意思是我有一个返回的请求,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()
  }
    
Run Code Online (Sandbox Code Playgroud)
  1. 我们发出经过身份验证的请求
  2. 我们映射请求,如果失败,则我们发出重新验证请求并重试。否则我们只是返回输入。
  3. 无论哪种方式,我们现在都有一个发布者的发布者,但我们不希望这样,所以我们调用切换到最新版本来压平它,然后继续。