Adjunto solicitudes fallidas al administrador de colas (contiene una matriz) en caso de que no haya conexión
Estoy presentando una ventana emergente personalizada con un botón de reintento. Cuando se presiona el botón de reintento, quiero volver a intentar las solicitudes que no se pueden enviar en el estado sin conexión. Puede haber más de una solicitud.
Cuando pruebo el método retryRequest de la clase de Session de Alamofire, el estado de la tarea de la solicitud permanece en el estado inicializado o finalizado, pero debe reanudarse para enviar la solicitud correctamente, ¿cómo puedo resolver esta situación?
InterceptorInterface.swift
public func didGetNoInternetConnection() { let viewModel = AppPopupViewModel(title: L10n.AppPopUp.areYouOffline, description: L10n.AppPopUp.checkInternetConnection, image: Images.noInternetConnection.image, firstButtonTitle: L10n.General.tryAgain, secondButtonTitle: nil, firstButtonAction: { [weak self] in guard let self = self else { return } DispatchQueue.main.async { self.retry() } }, secondButtonAction: nil, dismissCompletion: nil, dimColor: Colors.appGray.color.withAlphaComponent(0.8), showCloseButton: true, customView: nil) DispatchQueue.main.async { AppPopupManager.show(with: viewModel, completion: nil) } } private func retry() { guard let head = NetworkRequestStorage.shared.head else { return } let request = head.request let session = head.session session.retryRequest(request, withDelay: nil) }APIInterceptor.swift
final class APIInterceptor: Alamofire.RequestInterceptor { private let configure: NetworkConfigurable private var lock = NSLock() // MARK: - Initilize internal init(configure: NetworkConfigurable) { self.configure = configure } // MARK: - Request Interceptor Method internal func adapt(_ urlRequest: URLRequest, for session: Session, completion: @escaping (Result<URLRequest, Error>) -> Void) { lock.lock() defer { lock.unlock() } var urlRequest = urlRequest if let token = self.configure.accessToken { /// Set the Authorization header value using the access token. urlRequest.setValue("Bearer " + token, forHTTPHeaderField: "Authorization") } // Set Accept-Language header value using language code urlRequest.setValue(configure.languageCode, forHTTPHeaderField: "Accept-Language") // Arrange Request logs for develope and staging environment if let reachability = NetworkReachabilityManager(), !reachability.isReachable { configure.didGetNoInternetConnection() completion(.failure(APIClientError.networkError)) } completion(.success(urlRequest)) } // MARK: - Error Retry Method internal func retry(_ request: Request, for session: Session, dueTo error: Error, completion: @escaping (RetryResult) -> Void) { // Arrange Error logs for develope and staging environment if let aError = error as? APIClientError, aError.statusCode == 400 { // no connection state NetworkRequestStorage.shared.enqueue(request: request, session: session) completion(.doNotRetryWithError(error)) } else { request.retryCount <= configure.retryCount ? completion(.retry) : completion(.doNotRetryWithError(error)) } } } Si la solicitud tiene éxito o no hay ningún error de conexión, la elimino de la clase NetworkRequestStoroge .