Исключение точки останова при выполнении запроса AF5 - PullRequest
0 голосов
/ 01 апреля 2020

Поэтому я пытаюсь проверить, действителен ли канал-носитель перед каждым запросом, но когда я запускаю запрос токена refre sh, Alamofire получает исключение при предварительном условии отправки: Что я делаю неправильно? это вообще возможно?

extension Session: SessionStateProvider {
    func request(for task: URLSessionTask) -> Request? {
        dispatchPrecondition(condition: .onQueue(rootQueue))

        return requestTaskMap[task]
    }

Основной вызывающий запрос, где проверяется первый токен


private static func createRequest(urlConvertible:  URLRequestConvertible)-> Alamofire.DataRequest?{
        if let manager = sessionManager{
            return manager.request(urlConvertible)
///custom manager that checks the tokens
        }else if let manager = authenticatedManager{
            manager.verifyRequest(url: urlConvertible) { (result) in
                return result
            }

        }
        return nil
    }

    ///  This method make a request using the JSONAPI's Format - Only to the 'data' structure
    ///
    /// - Parameter urlConvertible: Codabel Onject to parse teh response
    /// - Returns: The Codable object if success or not
    static func requestJSONAPI<T: Codable> (_ urlConvertible: URLRequestConvertible) -> Observable<T> {
        initManager(urlConvertible: urlConvertible)

        //Create an RxSwift observable, which will be the one to call the request when subscribed to
        return Observable<T>.create { observer in
            let request = createRequest(urlConvertible: urlConvertible)?
                .debugLog()
                .validate()
                .responseCodableJSONAPI(keyPath: "data", completionHandler: { (response: AFDataResponse<T>) in
                    switch response.result {
                    case .success(let value):

                        let jsonDataString = String(data: response.data ?? Data(), encoding: String.Encoding.utf8)!
                        print("Post Request Params : \(jsonDataString)")
                        observer.onNext(value)

Вот мой код, где auth.refreshtokens получает новые токены с AF. запрос

    private func shouldRefreshToken() -> Bool {

        do {
            let jwt = try decode(jwt: accessToken)
            return jwt.expired
        } catch {

        }
        return false
    }

    func verifyRequest(url: URLRequestConvertible, completion: @escaping (_ result: DataRequest) -> Void){

        if  shouldRefreshToken() {
            let auth = interceptor
///makes an AF.request to get the new tokens - where it crashes
            auth.refreshTokens { [weak self] succeeded, accessToken, refreshToken in
                self?.accessToken = accessToken!
                completion((self?.sessionManager?.request(url))!)
            }
        }else{
            completion((self.sessionManager?.request(url))!)
        }

    }
´´´





1 Ответ

0 голосов
/ 01 апреля 2020

Вероятно, это ошибка Alamofire. Не могли бы вы создать новую проблему на нашем GitHub с полной трассировкой стека от cra sh и фрагментами кода, которые вы разместили здесь, или с примером проекта?

Кроме того, большая часть вашего обработка asyn c не будет работать правильно, как ваша попытка return result внутри verifyRequest, но я не уверен, имеет ли это какое-либо отношение к этой проблеме.

Кроме того, я бы предложил рефакторинг обработки вашего токена в RequestInterceptor с адаптером, который добавляет токен, и ретранслятором, который при необходимости повторно изменит sh токен, чтобы повторить запрос. Нет необходимости выполнять проверку вручную, Alamofire автоматически поддерживает подобные вещи.

...