Alamofire 5:EXC_BAD_ACCESS
Alamofire 5: EXC_BAD_ACCESS
我在使用 Alamofire 5.0 CR3 时发生崩溃
Alamofire 库 RequestTaskMap.swift 中发生崩溃。
我没有任何堆栈跟踪,只有 Firebase 崩溃报告,我觉得它有点没用。
我有时会遇到这种崩溃,使用相同的方法,使用相同的值。
func getUserDetails(for id: Int, success: @escaping(User) -> (), fail: @escaping failBlock) {
APIClient.performRequest(for: UserDetailsRoute(userId: id)) { (response: Result<User, AFError>) in
self.complete(response, success: success, fail: fail)
}
}
路由器:
struct UserDetailsRoute: Route {
let userId: Int
var methodType: HTTPMethod { return .get }
var path: URL { return APIType.client.url.appendingPathComponent("/user/\(userId)") }
var customHeaders: [String : String]? { return [HTTPHeaderField.contentType.rawValue : ContentType.urlEncoded.rawValue] }
}
执行请求:
@discardableResult
func performRequest<T: Decodable>(for route: Route, decoder: JSONDecoder = JSONDecoder(), completion: @escaping (Result<T, AFError>) -> Void) -> DataRequest {
return sessionManager.request(NetworkRouter(route))
.validate(statusCode: 200..<300)
.responseDecodable(decoder: decoder) { (response: DataResponse<T, AFError>) in
completion(response.result)
}
}
URLRequestConvertible:
struct NetworkRouter: URLRequestConvertible {
let route: Route
init(_ route: Route) {
self.route = route
}
func asURLRequest() throws -> URLRequest {
var urlRequest = URLRequest(url: route.path)
// HTTP Method
urlRequest.httpMethod = route.methodType.rawValue
// Common Headers
urlRequest.setValue(NetworkConfig.CLIENT_ID, forHTTPHeaderField: HTTPHeaderField.clientId.rawValue)
urlRequest.setValue(AppSettings.shared.interfaceLanguage, forHTTPHeaderField: HTTPHeaderField.acceptLanguage.rawValue)
// Custom headers
if let headers = route.customHeaders {
for header in headers {
urlRequest.setValue(header.value, forHTTPHeaderField: header.key)
}
}
// Body
if let route = route as? RouteBody {
urlRequest.httpBody = route.data
}
// Parameters
if let route = route as? RouteParameters {
do {
urlRequest = try route.encoder.encode(urlRequest, with: route.parameters)
} catch {
throw AFError.parameterEncodingFailed(reason: .customEncodingFailed(error: error))
}
}
return urlRequest
}
}
知道我该怎么做才能解决这个问题吗?我真的不知道从哪里开始。
// 编辑 1:
在 AppScheme 中添加 Zombi 对象给我:致命错误:在展开可选值时意外发现 nil。
嗯
// 编辑 2:
// 编辑 3:
从 bt 命令添加堆栈跟踪:
看来是多线程问题。创建会话时是否使用自定义队列?检查 rootQueue 是否是串行的。
根据文档:
/// Root `DispatchQueue` for all internal callbacks and state update. **MUST** be a serial queue.
我在使用 Alamofire 5.0 CR3 时发生崩溃
Alamofire 库 RequestTaskMap.swift 中发生崩溃。
我没有任何堆栈跟踪,只有 Firebase 崩溃报告,我觉得它有点没用。
我有时会遇到这种崩溃,使用相同的方法,使用相同的值。
func getUserDetails(for id: Int, success: @escaping(User) -> (), fail: @escaping failBlock) {
APIClient.performRequest(for: UserDetailsRoute(userId: id)) { (response: Result<User, AFError>) in
self.complete(response, success: success, fail: fail)
}
}
路由器:
struct UserDetailsRoute: Route {
let userId: Int
var methodType: HTTPMethod { return .get }
var path: URL { return APIType.client.url.appendingPathComponent("/user/\(userId)") }
var customHeaders: [String : String]? { return [HTTPHeaderField.contentType.rawValue : ContentType.urlEncoded.rawValue] }
}
执行请求:
@discardableResult
func performRequest<T: Decodable>(for route: Route, decoder: JSONDecoder = JSONDecoder(), completion: @escaping (Result<T, AFError>) -> Void) -> DataRequest {
return sessionManager.request(NetworkRouter(route))
.validate(statusCode: 200..<300)
.responseDecodable(decoder: decoder) { (response: DataResponse<T, AFError>) in
completion(response.result)
}
}
URLRequestConvertible:
struct NetworkRouter: URLRequestConvertible {
let route: Route
init(_ route: Route) {
self.route = route
}
func asURLRequest() throws -> URLRequest {
var urlRequest = URLRequest(url: route.path)
// HTTP Method
urlRequest.httpMethod = route.methodType.rawValue
// Common Headers
urlRequest.setValue(NetworkConfig.CLIENT_ID, forHTTPHeaderField: HTTPHeaderField.clientId.rawValue)
urlRequest.setValue(AppSettings.shared.interfaceLanguage, forHTTPHeaderField: HTTPHeaderField.acceptLanguage.rawValue)
// Custom headers
if let headers = route.customHeaders {
for header in headers {
urlRequest.setValue(header.value, forHTTPHeaderField: header.key)
}
}
// Body
if let route = route as? RouteBody {
urlRequest.httpBody = route.data
}
// Parameters
if let route = route as? RouteParameters {
do {
urlRequest = try route.encoder.encode(urlRequest, with: route.parameters)
} catch {
throw AFError.parameterEncodingFailed(reason: .customEncodingFailed(error: error))
}
}
return urlRequest
}
}
知道我该怎么做才能解决这个问题吗?我真的不知道从哪里开始。
// 编辑 1: 在 AppScheme 中添加 Zombi 对象给我:致命错误:在展开可选值时意外发现 nil。
嗯
// 编辑 2:
// 编辑 3: 从 bt 命令添加堆栈跟踪:
看来是多线程问题。创建会话时是否使用自定义队列?检查 rootQueue 是否是串行的。
根据文档:
/// Root `DispatchQueue` for all internal callbacks and state update. **MUST** be a serial queue.