2016-04-12 2 views
2

Ich frage mich, wie ich meine Funktion verlassen kann, wenn die Anfrage abgelaufen ist. Wenn ich meinen Server offline setzen und versuchen, einige Anrufe mit dieser Funktion der App stürzt durch: fatale Fehler: unerwartet gefunden null, während einem optionalen Wert AbwickelnSwift Alamofire beendet, wenn Anfrage abgelaufen ist

Meiner Alamofire v3.x Funktion sieht wie folgt aus :

static func loginWithFb(facebookId: String, email: String, username: String, response: (token: String?, errorVal: JSON?) ->()) { 
     let urlString = baseURL + ResourcePath.FbLogin.description 

     let parameters: [String: AnyObject] = [ 
      "facebook_id": facebookId, 
      "user_type": 1, 
      "email": email, 
      "username": username 
     ] 
     Alamofire.request(.POST, urlString, parameters: parameters).responseJSON{ (responseData) -> Void in 

      let json = JSON(responseData.result.value!) 

      let token = json["api_key"].string 
      response(token: token, errorVal: json) 
     } 

    } 

ich null ab: let json = JSON(responseData.result.value!)

und den Fehler:

FAILURE: Error Domain=NSURLErrorDomain Code=-1001 "The request timed out." UserInfo={NSUnderlyingError=0x7fc39349c4a0 {Error Domain=kCFErrorDomainCFNetwork Code=-1001 "(null)" UserInfo={_kCFStreamErrorCodeKey=-2102, _kCFStreamErrorDomainKey=4}}, NSErrorFailingURLStringKey=http://mysite.dev/fb, NSErrorFailingURLKey=http://mysite.dev/fb, 
_kCFStreamErrorDomainKey=4, _kCFStreamErrorCodeKey=-2102, NSLocalizedDescription=The request timed out.} 
fatal error: unexpectedly found nil while unwrapping an Optional value 

Also wie kann ich den Anruf beenden, wenn die Anfrage abgelaufen ist? verhindern, dass es versucht, die JSON-Daten

Danke, hier

Antwort

2

Sie können das Zeitüberschreitungsintervall erhöhen, wenn Ihr Dienst längere Zeit benötigt.

let request = NSMutableURLRequest(URL: NSURL.init(string: "your url")!) 
request.HTTPMethod = "GET" 
request.timeoutInterval = 250 // Set your timeout interval here. 

Alamofire.request(request).responseJSON { (responseData) -> Void in 
    if((responseData.result.value) != nil) { //Check for response 
     print(responseData.result.value!) 
    } 
} 

Und muss überprüfen, dass die Antwort nicht Null ist, um das Problem eines schwerwiegenden Fehlers zu lösen.

+2

wie Parameter und header übergeben? –

+0

Ich habe auch params senden wollen, aber nicht wie –

1

Ihr Problem zu erhalten ist

 let json = JSON(responseData.result.value!) 

Sie sind Kraft Abwickeln value! stattdessen sollten Sie es in einer if let

wickeln
if let json = JSON(responseData.result.value) as? NSDictionary { 
      let token = json["api_key"].string 
      response(token: token, errorVal: json) 
} 

Die Zeitüberschreitung ist in Ordnung und wirkt sich nicht auf Ihre App aus.

+0

Vielen Dank, aber ich habe versucht, es in eine wenn, aber ich habe: "Wert von optionalen Typ 'AnyObject' nicht ausgepackt, wollten Sie '!' oder '?' – user2722667

+0

Ich habe bearbeitet, Sie haben nicht die JSON-Methode geschrieben, so dass ich es rckgab gibt ein NSDictionary – SeanLintern88

1

Sie müssen mehr über schnelle Variable Unwrapping wissen, nur eine einfache if(myJsonData != nil) würde den App-Absturz verhindern, können Sie auch eine Warnmeldung hinzufügen, falls keine Daten auf dem Server oder der Server ist usw. usw.

static func loginWithFb(facebookId: String, email: String, username: String, response: (token: String?, errorVal: JSON?) ->()) { 
      let urlString = baseURL + ResourcePath.FbLogin.description 

      let parameters: [String: AnyObject] = [ 
       "facebook_id": facebookId, 
       "user_type": 1, 
       "email": email, 
       "username": username 
      ] 
      Alamofire.request(.POST, urlString, parameters: parameters).responseJSON{ (responseData) -> Void in 

       let myJsonData = JSON(responseData.result.value!) 

       if(myJsonData != nil) 
       { 
        let token = myJsonData["api_key"].string 
       } 
       else 
       { 
        // show alert box 
       } 
      } 

     }