web-dev-qa-db-ja.com

AlamoFireはタイムアウト間隔を考慮しません

class APIClient {
    var user = User()
    let alamoFireManager : Alamofire.Manager?
    let center = NSNotificationCenter.defaultCenter()


    init(){
        let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
        configuration.timeoutIntervalForRequest = 4 // seconds
        configuration.timeoutIntervalForResource = 4
        self.alamoFireManager = Alamofire.Manager(configuration: configuration)
    }

    func test(){
        //This does not respect the 4 second time out. Why?
        self.alamoFireManager!.request(.POST, CONSTANTS.APIEndpoint+"/test", parameters: parameters).responseJSON {
                        (req, res, json, error)  in
                        if let json = self.handleAPIResponse(req, res: res, json_data: json, error: error){
                        }
                    }
    }
41
TIMEX

4秒のタイムアウトは強制されていませんか?実験を作成しました:

    let center = NSNotificationCenter.defaultCenter()
    var alamoFireManager : Alamofire.Manager?

    let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
    configuration.timeoutIntervalForRequest = 4 // seconds
    configuration.timeoutIntervalForResource = 4
    self.alamoFireManager = Alamofire.Manager(configuration: configuration)

    self.alamoFireManager!.request(.POST, "http://oznet.go.ro/iDorMobile/ConfigServer/api.php/timeout/2", parameters: nil).responseJSON {
        (req, res, json, error)  in
        println("First json \(json)")
        println("First error \(error)")
    }

    self.alamoFireManager!.request(.POST, "http://oznet.go.ro/iDorMobile/ConfigServer/api.php/timeout/6", parameters: nil).responseJSON {
        (req, res, json, error)  in
        println("Second \(json)")
        println("Second \(error)")
    }

そして私が得たコンソール出力:

First json Optional({
    name = timeoutTest;
    value = 2;
})
First error nil
Second nil
Second Optional(Error Domain=NSURLErrorDomain Code=-1001 "The request timed out." UserInfo=0x7f91dc8223e0 {NSErrorFailingURLKey=http://oznet.go.ro/iDorMobile/ConfigServer/api.php/timeout/6, NSLocalizedDescription=The request timed out., NSErrorFailingURLStringKey=http://oznet.go.ro/iDorMobile/ConfigServer/api.php/timeout/6})

私の例のURLは現在ダウンしています。オンラインに戻そうとします。 例のURLを使用してテストできます。最後に別の数値を設定することにより、タイムアウト(秒単位)を変更できます。

Alamofireの最後のバージョンのココアポッドを使用しました。

37
alinoz

要求マネージャーのグローバル変数を作成する必要があります。

var alamoFireManager = Alamofire.Manager.sharedInstance

そして、カスタムパラメータを設定した後:

 let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
    configuration.timeoutIntervalForRequest = 4 // seconds
    configuration.timeoutIntervalForResource = 4
    self.alamoFireManager = Alamofire.Manager(configuration: configuration)
9
Dab88

5秒のタイムアウトを持つalamofireManagerを取得するためのSwift 3.0/Alamofire 4.0のコードは次のとおりです。

    let configuration = URLSessionConfiguration.default
    configuration.timeoutIntervalForResource = 5 // seconds

    let alamofireManager = Alamofire.SessionManager(configuration: configuration)
8
Jamie McCrindle

これはあなたのために働くと思います、あなたはAlamofire.Managerのインスタンスを関数の外側で宣言する必要があることに注意してください、以下のコードを参照してください

//Declare it out side the function
var alamoFireManager : Alamofire.Manager!

func callUrl() {
    let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
    configuration.timeoutIntervalForResource = 10800 // seconds
    configuration.timeoutIntervalForRequest = 10800 // seconds

    alamoFireManager = Alamofire.Manager(configuration: configuration)

    alamoFireManager.request(.POST, url, parameters: dir as? [String : AnyObject], encoding: .JSON, headers: [ "Content-Type": "application/json"])
        .responseJSON { response in
    }
}

これがあなたを助けることを願っています

6
Patel Jigar
 init(){
    let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
    configuration.timeoutIntervalForResource = 4
    configuration.timeoutIntervalForRequest = 4
    self.alamoFireManager = Alamofire.Manager(configuration: configuration)
    self.alamoFireManager!.request(.POST, CONSTANTS.APIEndpoint+"/test", parameters: parameters).responseJSON {
                    (req, res, json, error)  in
                    if let json = self.handleAPIResponse(req, res: res, json_data: json, error: error){
                    }
                }
}

つかいます self.alamoFireManager!.request同じinit関数では、タイムアウト遅延は関数全体ではなく、リクエストに対してのみです。それが役立つかもしれません。

3
Faran Ghani

上記のメソッドを使用したときにNSURLErrorDomainを取得しました。これは私のコードです(Swift 3.2/Alamofire 4.4)

    let manager = Alamofire.SessionManager.default
    manager.session.configuration.timeoutIntervalForRequest = 4

    manager.request(.POST, CONSTANTS.APIEndpoint+"/test", parameters: parameters).responseJSON {
                    (req, res, json, error)  in
                    if let json = self.handleAPIResponse(req, res: res, json_data: json, error: error){
                    }
1
Leibniz