web-dev-qa-db-ja.com

Moyaポッドを使用してリクエストのタイムアウトを設定するにはどうすればよいですか?

Swift 3と Moya ポッドを使用しています。

基本的な使用法 を使用して必要なものをすべて構成しましたが、タイムアウトを設定できる関数または変数が見つかりませんでした(すべての要求または特定の要求に対して)。

これどうやってするの?

16
Roberto Sampaio

haydarKarkin はこれに対する答えを GitHubへのコメント で提供しています。以下のコードスニペットは、彼のコメントから直接コピーされています。


カスタムAlamofireSession Managerを作成することにより、Moyaプロバイダーのカスタム構成を作成できます。

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

次に、プロバイダーを宣言するときにカスタムAlamofireManagerを含めます。

let Provider = MoyaProvider<GithubAPI>(endpointClosure: endpointClosure,
        manager: DefaultAlamofireManager.sharedManager,
        plugins: [NetworkActivityPlugin(networkActivityClosure: networkActivityClosure)])
30
askielboe

セッションマネージャでセッション構成を管理し、異なるタイムアウト値を使用する要求を決定できます。

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)
                }
            }
    }
}
3
Angel Martin

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