【问题标题】:Observable.create inside generic Alamofire call function not working when calling validate()调用 validate() 时,通用 Alamofire 调用函数中的 Observable.create 不起作用
【发布时间】:2019-07-11 07:02:14
【问题描述】:

我想通过“通用”功能使用 Alamofire 发出经过验证的网络请求。 如果我根本不使用 RX,或者如果我不调用 validate() 或 anyCustomValidate() 它工作正常,但如果我将它与 Observable.create 和 validate() 一起使用,如下所示,它不起作用。 这就是它的作用:

     1.makes tokenRefresh call
     2.receives the new token
     3.calls completion(true, 0.0) (as below)

然后什么都没有发生......

这是我的通用函数:

func sendRequest<Response: Codable>(endpoint: URLRequestConvertible) -> Observable<Response> {
    return Observable<Response>.create { observer in
        let request = self.session.request(endpoint)
            .validate()
            .responseJSON { response in
                print(response)
                switch response.result {
                case .success:
                    do {
                        let model = try JSONDecoder().decode(Response.self, from: response.data!)
                        observer.onNext(model)
                    } catch {
                        print("generic call function error: \(error)")
                        observer.onError(RequestError.failedParsingError(ErrTypes.somethingWrong.rawValue))
                    }
                case .failure:
                observer.onError(RequestError.failedParsingError(ErrTypes.somethingWrong.rawValue))
                }
        }
        return Disposables.create {
            request.cancel()
        }
    }.observeOn(MainScheduler.instance)
}

这是我使用它来获得特定响应的方式:

func getAddresses(clientId: Int) -> Observable<[AddressesResponse]> {
    return sendRequest(endpoint: CustomerEndPoint.getAddresses(userID: clientId))
}

这就是我调用函数的方式:

 @objc func buttonPressed() {
    getAddresses(clientId: 1111).subscribe(onNext: { addresses in
        print(addresses)
    }).disposed(by: disposeBag)
}

这是我的请求重试器:

extension AuthHandler: RequestRetrier {

func should(_ manager: SessionManager, retry request: Request, with error: Error, completion: @escaping RequestRetryCompletion) {
    guard let request = request as? DataRequest, request.delegate.data != nil else { fatalError() }
    guard let headerStatusCode = request.response?.statusCode else {
        completion(false, 0.0)
        return
    }
    if headerStatusCode == 401 || headerStatusCode == 403 {
        refreshToken(success: {
            completion(true, 0.0)
        }, failure: { message in
            print(message)
        })
    } else {
        if let json = String(data: request.delegate.data!, encoding: String.Encoding.utf8),
        let jsonObject = dictionaryWithJSONString(json) as? [String:Any],
        let statusMessage = jsonObject["statusMessage"] as? [String: Any],
        let status = statusMessage["status"] as? Int {
            if status == 401 || status == 403 {
                self.refreshToken(success: {
                    completion(true, 0.0)
                }, failure: { message in
                    completion(false, 0.0)
                    print(message)
                })
            }
        }
    }
}

一段时间后,这会打印在控制台日志上:

2019-02-17 22:25:13.368846+0100 AlamofireValidator[76262:1527976] [BoringSSL] nw_protocol_boringssl_get_output_frames(1301) [C1.1:2][0x7fc5cf50e020] get output frames failed, state 8196

【问题讨论】:

    标签: swift alamofire rx-swift request-validation


    【解决方案1】:

    这样的错误几乎总是意味着您的完成块或观察者没有在其中一个路径中被调用。

    在这种特定情况下,我认为您的最后几次 if 检查是可疑的。将下面的两个打印语句放入并在它们上放置断点。我想你会发现其中一个被触发了。

    {
        if let json = String(data: request.delegate.data!, encoding: String.Encoding.utf8),
            let jsonObject = dictionaryWithJSONString(json) as? [String:Any],
            let statusMessage = jsonObject["statusMessage"] as? [String: Any],
            let status = statusMessage["status"] as? Int {
            if status == 401 || status == 403 {
                self.refreshToken(success: {
                    completion(true, 0.0)
                }, failure: { message in
                    completion(false, 0.0)
                    print(message)
                })
            }
            else {
                print("the problem is here")
            }
        }
        else {
            print("the problem is here.")
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-19
      • 2016-03-12
      • 2021-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多