2017-05-05 4 views
-1

Ich bin sehr neu zu Swift 3, und ich muss eine GET-Anfrage auf meiner API. Ich benutze Alamofire, das asynchrone Funktionen verwendet.Thread 1: Signal SIGABRT alamofire

ich genau das gleiche auf meinem Android-App und die GET liefert Daten JSON

Dies ist mein Code in swift:

 func getValueJSON() -> JSON { 
     var res = JSON({}) 
     let myGroup = DispatchGroup() 
     myGroup.enter() 
     Alamofire.request(url_).responseJSON { response in 
      res = response.result.value as! JSON 
      print("first result", res) 
      myGroup.leave() 
     } 
     myGroup.notify(queue: .main) { 
      print("Finished all requests.", res) 
     } 
     print("second result", res) 
     return res 
    } 

Aber ich habe ein Problem mit der Zeile „res = Antwort .result.value "Was gibt mir den Fehler: Thread 1: Signal SIGABRT

Ich verstehe wirklich nicht, wo das Problem herkommt, es war ziemlich schwer, eine" synchrone "Funktion zu tun, vielleicht mache ich es falsch.

Mein Ziel ist es, das Ergebnis der Anfrage in einer Variablen zu speichern, die ich zurückgeben. Jeder kann helfen?

Antwort

0

Ich würde Ihnen empfehlen, Alamofire zusammen mit SwiftyJSON zu verwenden, weil Sie auf diese Weise JSON viel einfacher parsen können.

Hier ist ein klassisches Beispiel:

Alamofire.request("http://example.net", method: .get).responseJSON { response in 
    switch response.result { 
    case .success(let value): 
     let json = JSON(value) 
     print("JSON: \(json)") 
    case .failure(let error): 
     print(error) 
    } 
} 

Wenn Sie parameters übergeben müssen, oder headers, es ist nur in der request Methode hinzufügen.

let headers: HTTPHeaders = [ 
     "Content-Type:": "application/json" 
] 

let parameters: [String: Any] = [ 
     "key": "value" 
] 

So wird Ihre Anfrage so etwas wie diese (das ist POST-Anfrage):

Alamofire.request("http://example.net", method: .post, parameters: parameters, encoding: JSONEncoding.default, headers: headers).responseJSON { response in 

switch response.result { 

     case .success(let value): 
      print(value) 
     case .failure(let error): 
      print(error) 
    } 
} 

Ich habe es nicht getestet, aber es sollte funktionieren. Außerdem müssen Sie allow arbitary load auf yes (App Transport Security Settings in info.plist) setzen, wenn Sie Anfragen über HTTP-Protokoll zulassen möchten.

Dies wird nicht empfohlen, aber es ist in Ordnung für die Entwicklung.

+0

Es scheint in Ordnung, aber wie kann ich eine Variable zurückgeben, die ich in der Schleife deklariere? Wenn ich es an einem anderen Ort erkläre, habe ich Threadfehler –

+0

Ich erkläre normalerweise eine Klasseneigenschaft. '' 'var results: JSON = []' '' und darunter füge ich '' 'self.results = JSON (Wert)' '' in '' .success (let value) '' 'case hinzu, damit kann ich später benutze es. Aber das erfordert '' 'SwiftyJSON'''. – Nedim

+0

Aber weil es asynchron ist, kann ich die Variable nicht speichern, da die Anfrage nach dem Druckvorgang endet. Wie würdest du deine Semaphore einstellen? Oder etwas anderes vielleicht? –

Verwandte Themen