在 Swift 3.0 (Alamofire 4.4.0) 中的一些请求后,Alamofire 停止工作

Posted

技术标签:

【中文标题】在 Swift 3.0 (Alamofire 4.4.0) 中的一些请求后,Alamofire 停止工作【英文标题】:Alamofire stops working after some requests in Swift 3.0 (Alamofire 4.4.0) 【发布时间】:2017-03-17 18:59:37 【问题描述】:

关键信息:

    预计从 2.3 迁移到 Swift 3.0。 Xcode 版本 8.2.1、ios 版本 10.2、Alamaofire 4.4.0、AlamofireObjectMapper 4.1.0

在拨打某些电话后,Alamofire 会停止拨打电话。我没有收到回调,并且一旦停止工作,我就看不到在 Charles 中进行的任何网络调用。

我使用一个管理器进行调用,该管理器又调用一个帮助客户端类,该类请求 Alamofire 获取我存储在客户端数组中的请求对象。您可以在下面看到我的类的部分代码。

// This is in BaseClient
    /* GET Request
     default response with mappable data and NSerror
     */
    @discardableResult
    class func getRequest<T: Mappable>(_ apiRoute: String, params: [String: Any], credentialsRequired: Bool = false, completion: @escaping (T?, Error?) -> Void) -> DataRequest 
        let headers = additionalHeaders(credentialsRequired)
        let request = Alamofire.request(getURL(for: apiRoute), method: .get, parameters: params, headers: headers)
            .responseObject  (response: DataResponse<DefaultResponse<T>>) -> Void in
                logResponse(response.result.value)
                if let error = self.checkForError(response, endPoint: apiRoute) 
                    completion(nil, error)
                 else 
                    completion(response.result.value?.data, nil)
                
        

        logCurl(request)
        return request
    

这是辅助客户端类

    import ObjectMapper
    import Alamofire

    class PackageClient: BaseClient 
        fileprivate struct PackagesEndPoint 
            static let inspire = "/api/v2/something"
    

fileprivate static var currentRequests = [Request]()

class func cancelAllFetchRequests() 
    for item in currentRequests 
        item.cancel()
    
    currentRequests = [Request]()


    class func fetchInspire(_ completion: @escaping (_ response: InspireResponse?, _ error: Error?) -> Void) 
PackageClient.cancelAllFetchRequests()

        var params = [String: Any]()
        params["product"] = "flight,event,package" 
      let request = getRequest(PackagesEndPoint.inspire,
                   params: params,
                   credentialsRequired: false) (response: InspireResponse?, error: Error?) in
                    completion(response, error)
        
    currentRequests.append(request)
    

这是在 PackageManager 中:

    PackageClient.fetchInspire  [weak self] (response, error) in

        if error == nil 
            self?.inspireResponse = response
        
        self?.finishLoading(error: error)
    

问题是一旦 Alamofire 停止工作,那么像下面这样的简单调用也不会进行任何网络调用......我在 charles 上看不到任何东西,显然没有返回回调。

Alamofire.request(URL(string: urlString), method: .get, parameters: parameters, encoding: JSONEncoding.default)
.validate  request, response, data in
    // Custom evaluation closure now includes data (allows you to parse data to dig out error messages if necessary)
    return .success

.responseJSON  response in
    debugPrint(response)

感谢任何帮助。我花了 2 天时间来调试这个。 :(

【问题讨论】:

【参考方案1】:

这也发生在我身上。我在我的代码中使用了objc_sync_enter(self) 调用,这导致了死锁。

This issue Github 上的 Alamofire 可能会对您有所帮助。

【讨论】:

以上是关于在 Swift 3.0 (Alamofire 4.4.0) 中的一些请求后,Alamofire 停止工作的主要内容,如果未能解决你的问题,请参考以下文章

Alamofire 4.0 / Swift 3.0 - 附加多部分表单数据(CSV 文件)

Swift 3.0 Alamofire 4.0 - Domain=NSURLErrorDomain Code=-999 “取消”

使用 Swift 3.0 的 Alamofire 4 失败:错误域 = NSURLErrorDomain 代码 = -999 “已取消”

响应和响应序列化程序 Swift 3.0 的 Alamofire 3->4 问题

Alamofire Swift 3.0 调用中的额外参数

Swift 3.0 迁移后的 Alamofire 错误:“调用中的额外参数”(请求方法)