2015-08-14 11 views
26

Mam pytanie na temat nowej wersji Alamofire dla Swift 2Jak uzyskać wartość wyniku Alamofire.request(). ResponseJSON w Swift 2?

Alamofire.request(.POST, urlString, parameters: parameters as? [String : AnyObject]) 
     .responseJSON { (request, response, result) -> Void in 
      let dico = result as? NSDictionary 
      for (index, value) in dico! { 
       print("index : \(index)  value : \(value)") 
      } 
    } 

W tej części chciałbym rzucić wynik w do NSDictionary. Ale kiedy kompiluję i umieszczam punkt przerwania, debugger mówi, że dico jest zerowe. Jeśli użyję debugDescription do wydrukowania wyniku, to nie jest on zerowy i zawiera to, czego oczekiwałem. Jak mogę rzucić zmienną Result?

+2

Spróbuj ' jeśli dico = wynik jako? [String: AnyObject] {...} ' – mattt

+0

Jeśli to nie zostanie wykonane, to dlatego, że wynik był zerowy (lub nie można go skierować do słownika). Powinieneś sprawdzić, co jest w "błędzie". – mattt

+0

Warto również zauważyć, że słowniki mają klucze, a nie indeksy. – mattt

Odpowiedz

52

Zaakceptowanych odpowiedź działa świetnie, ale z wprowadzeniem Alamofire 3.0.0 istnieją pewne zmiany, które wpływa na łamanie tej realizacji.
The migration guide ma dalsze wyjaśnienia, ale ja podkreślę te związane z rzeczywistym rozwiązaniem.

  • Response
    Wszystkie serializers reakcji (z wyjątkiem odpowiedzi) zwracają ogólny struct reakcji.

  • Response type
    Typ Wynik został przeprojektowany, aby być podwójne typu rodzajowego, że nie przechowuje NSData? w przypadku .Failure.

wziąć także w liczbie, która Alamofire traktuje każdy wypełniony wniosek, by odnieść sukces, niezależnie od treści odpowiedzi. Musisz więc połączyć .validate() przed .responseJSON(), aby trafić w obudowę .Failure. Przeczytaj więcej na ten temat here.

Zaktualizowany kod:

let url = "http://api.myawesomeapp.com" 
Alamofire.request(.GET, url).validate().responseJSON { response in 
    switch response.result { 
    case .Success(let data): 
     let json = JSON(data) 
     let name = json["name"].stringValue 
     print(name) 
    case .Failure(let error): 
     print("Request failed with error: \(error)") 
    } 
} 

Dla porównania:

  • Xcode 7.3 (Swift 2.2)
  • Alamofire 3.3.1
  • SwiftyJSON 2.3.3
+0

Dzięki za to. Działa !! – Das

+4

Alamofire nie trafi w przypadek .Failure, chyba że wprowadzisz łańcuch .validate() przed .responseJSON {}, więc potraktuje wszystkie ukończone żądania jako .Success, nawet jeśli kod statusu HTTP nie znajduje się w zakresie 200: https: //github.com/Alamofire/Alamofire#validation –

+0

Dzięki @ChrisTrevarthen, nie odnotowałem tego. Odpowiedź została zaktualizowana wraz z wyjaśnieniem. –

37

Jeśli nie przeszkadza SwiftyJSON bibliotekę, oto przykład pracy w Xcode 7 Beta 5 + Alamofire 2.0.0-beta.1 + SwiftyJSON (oddział xcode7)

Alamofire.request(.GET, url, parameters: params, encoding: ParameterEncoding.URL).responseJSON { (_, _, result) in 
    switch result { 
     case .Success(let data): 
      let json = JSON(data) 
      let name = json["name"].string 
     case .Failure(_, let error): 
      print("Request failed with error: \(error)") 
    } 
} 

Edit:

Updated SwiftyJSON git strona

+0

Link SwifyJSON jest zepsuty :( – swiftBoy

Powiązane problemy