Как установить тайм-аут для запросов с помощью модуля Moya?

Я использую Swift 3 и модуль Moya.

Я настроил все необходимое, используя базовое использование, но Я не нашел ни одной функции или переменной, для которой можно было бы установить тайм-аут (для каждого запроса или для конкретного запроса).

Как я могу это сделать?


person Roberto Sampaio    schedule 18.10.2016    source источник


Ответы (4)


haydarKarkin предоставил ответ на этот вопрос в комментарий на GitHub. Приведенные ниже фрагменты кода скопированы прямо из его комментария.


Вы можете создать настраиваемую конфигурацию для поставщика Moya, создав настраиваемый диспетчер сеансов Alamofire:

import Foundation
import Alamofire

class DefaultAlamofireManager: Alamofire.SessionManager {
    static let sharedManager: DefaultAlamofireManager = {
        let configuration = URLSessionConfiguration.default
        configuration.httpAdditionalHeaders = Alamofire.SessionManager.defaultHTTPHeaders
        configuration.timeoutIntervalForRequest = 20 // as seconds, you can set your request timeout
        configuration.timeoutIntervalForResource = 20 // as seconds, you can set your resource timeout
        configuration.requestCachePolicy = .useProtocolCachePolicy
        return DefaultAlamofireManager(configuration: configuration)
    }()    
}

Затем включите настраиваемый Alamofire Manager при объявлении вашего провайдера:

let Provider = MoyaProvider<GithubAPI>(endpointClosure: endpointClosure,
        manager: DefaultAlamofireManager.sharedManager,
        plugins: [NetworkActivityPlugin(networkActivityClosure: networkActivityClosure)])
person askielboe    schedule 02.01.2017
comment
endpointClosure и plugins - необязательные параметры инициализатора MoyaProvider. См. github.com/Moya/Moya/blob/master / docs / для получения дополнительной информации. - person askielboe; 06.03.2018
comment
На самом деле это неверно. Ни timeoutIntervalForRequest, ни timeoutIntervalForResource не соответствуют поведению timeoutInterval URLRequest. - person Jon Shier; 06.04.2020

Вы можете управлять конфигурацией сеанса в диспетчере сеансов и определять запросы, использующие другое значение тайм-аута.

import Foundation
import Moya

struct MyNetworkManager {
    static let provider = MoyaProvider<MyService>()

    static func request(
        target: MyService,
        success successCallback: @escaping (JSON) -> Void,
        error errorCallback: @escaping (Error) -> Void,
        failure failureCallback: @escaping (MoyaError) -> Void
        ) {
      //Check request
        switch target {
        case .quickAnswer:
            provider.manager.session.configuration.timeoutIntervalForRequest = 2
        default:
            provider.manager.session.configuration.timeoutIntervalForRequest = Manager.default.session.configuration.timeoutIntervalForRequest
        }
            provider.request(target) { result in
                let url = target.path
                switch result {
                case let .success(response):
                    do {
                        let _ = try response.filterSuccessfulStatusCodes()
                        let json = try JSON(response.mapJSON())
                        successCallback(json)
                    }
                    catch  {
                        errorCallback(error)
                    }
                case let .failure(error):
                    failureCallback(error)
                }
            }
    }
}
person Angel Martin    schedule 08.03.2018
comment
это не похоже на хорошее решение, если вы делаете несколько звонков одновременно. - person Bruno Koga; 26.04.2019

Отличный ответ @ askielboe обновлен для Alamofire 5:

class DefaultAlamofireSession: Alamofire.Session {
    static let shared: DefaultAlamofireSession = {
        let configuration = URLSessionConfiguration.default
        configuration.headers = .default
        configuration.timeoutIntervalForRequest = 20 // as seconds, you can set your request timeout
        configuration.timeoutIntervalForResource = 20 // as seconds, you can set your resource timeout
        configuration.requestCachePolicy = .useProtocolCachePolicy
        return DefaultAlamofireSession(configuration: configuration)
    }()
}
person Jonathan Cabrera    schedule 21.11.2019

При использовании последних версий Moya и Alamofire установите параметр сеанса провайдера с настраиваемым сеансом Alamofire.

class DefaultAlamofireSession: Alamofire.Session {
    static let shared: DefaultAlamofireSession = {
        let configuration = URLSessionConfiguration.default
        configuration.headers = .default
        configuration.timeoutIntervalForRequest = 30 // as seconds, you can set your request timeout
        configuration.timeoutIntervalForResource = 30 // as seconds, you can set your resource timeout
        configuration.requestCachePolicy = .useProtocolCachePolicy
        return DefaultAlamofireSession(configuration: configuration)
    }()
}

let provider = MoyaProvider<OpenApi>(session: DefaultAlamofireSession.shared, plugins: [authPlugin])
person Dhaval Bhimani    schedule 04.05.2020