在 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 “已取消”