21

I'm using Swift 3 and the Moya pod.

I configured everything I needed using the Basic Usage, but I didn't find any function or variable that I can set the timeout (for every requests or for a specific request).

How can I do this?

Roberto Sampaio
  • 531
  • 1
  • 5
  • 15

4 Answers4

32

haydarKarkin has provided an answer to this in a comment on GitHub. The code snippets below are copied directly from his comment.


You can create a custom configuration for a Moya provider by creating a custom Alamofire Session Manager:

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)
    }()    
}

Then include the custom Alamofire Manager when declaring your Provider:

let Provider = MoyaProvider<GithubAPI>(endpointClosure: endpointClosure,
        manager: DefaultAlamofireManager.sharedManager,
        plugins: [NetworkActivityPlugin(networkActivityClosure: networkActivityClosure)])
askielboe
  • 873
  • 13
  • 14
  • 1
    endpointClosure and plugins are optional parameters to the MoyaProvider initializer. See https://github.com/Moya/Moya/blob/master/docs/Providers.md#advanced-usage for more info. – askielboe Mar 06 '18 at 12:01
  • 1
    This is actually incorrect. Neither `timeoutIntervalForRequest` or `timeoutIntervalForResource` match the behavior of `URLRequest`'s `timeoutInterval`. – Jon Shier Apr 06 '20 at 19:41
7

@askielboe's great answer updated for 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)
    }()
}
Jonathan Cabrera
  • 1,656
  • 1
  • 19
  • 20
4

You can Manage the Session Configuration in your session Manager and decide the requests that use a different timeout value.

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)
                }
            }
    }
}
4

With Use of latest Moya and Alamofire versions, Set session parameter of provider with custom Alamofire session.

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])
Dhaval Bhimani
  • 980
  • 1
  • 13
  • 24