Alamofire 5: EXC_BAD_ACCESS - PullRequest
       1

Alamofire 5: EXC_BAD_ACCESS

0 голосов
/ 26 января 2020

Я получаю этот cra sh с Alamofire 5.0 CR3

Alamofire crash

Cra sh происходит в RequestTaskMap.swift из библиотеки Alamofire.

У меня нет трассировки стека, только отчет Firebase cra sh, который я нахожу бесполезным. Firebase crash report

Иногда я получаю этот cra sh по тому же методу с тем же значением.

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] }
}

PerformRequest:

@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: Добавление объектов Zombi в AppScheme дает мне: Неустранимая ошибка: неожиданно обнаружен ноль при развертывании необязательного значения.

Хмм

// Редактировать 2: l

// Редактировать 3: Добавление трассировки стека из bt команда:

bt stack trace

1 Ответ

1 голос
/ 02 февраля 2020

Это похоже на многопоточность. Используете ли вы пользовательские очереди при создании сеанса? Проверьте, является ли rootQueue последовательным.

Согласно do c:

/// Root `DispatchQueue` for all internal callbacks and state update. **MUST** be a serial queue.
...