2014-07-25 6 views
6

Nach dem Erstellen einer App mit RubyMotion ist dies meine erste Erfahrung mit der Entwicklung von Apps in Swift mit xCode.Schnelle dynamische Umwandlung fehlgeschlagen mit HTTP-GET-Anforderung

Ich verwende den folgenden Code, um alle Posts von einer Rails API zu erhalten, die Anfrage ist erfolgreich, aber die Analyse der JSON gibt einen Fehler.

Der Code:

func loadData() { 
    let url = NSURL(string: "http://localhost:3000/api/posts") 
    let task = NSURLSession.sharedSession().dataTaskWithURL(url, completionHandler: {(data, response, error) in 
     var err: NSError? 
     var json = NSJSONSerialization.JSONObjectWithData(data, options: .MutableLeaves, error: &err) as NSDictionary 
    }) 
    task.resume() 
} 

Der Fehler:

libswift_stdlib_core.dylib`swift_dynamicCastObjCClassUnconditional: 
0x103dbae20: pushq %rbp 
0x103dbae21: movq %rsp, %rbp 
0x103dbae24: pushq %rbx 
0x103dbae25: pushq %rax 
0x103dbae26: movq %rsi, %rcx 
0x103dbae29: movq %rdi, %rbx 
0x103dbae2c: xorl %eax, %eax 
0x103dbae2e: testq %rbx, %rbx 
0x103dbae31: je  0x103dbae4d    ;  swift_dynamicCastObjCClassUnconditional + 45 
0x103dbae33: movq 0x72b66(%rip), %rsi  ; "isKindOfClass:" 
0x103dbae3a: movq %rbx, %rdi 
0x103dbae3d: movq %rcx, %rdx 
0x103dbae40: callq *0x5e212(%rip)   ; (void *)0x0000000105b6f000: objc_msgSend 
0x103dbae46: testb %al, %al 
0x103dbae48: movq %rbx, %rax 
0x103dbae4b: je  0x103dbae54    ;  swift_dynamicCastObjCClassUnconditional +  52 
0x103dbae4d: addq $0x8, %rsp 
0x103dbae51: popq %rbx 
0x103dbae52: popq %rbp 
0x103dbae53: retq 
0x103dbae54: leaq 0xe427(%rip), %rax  ; "Swift dynamic cast failed" 
0x103dbae5b: movq %rax, 0x7974e(%rip)  ; gCRAnnotations + 8 
0x103dbae62: int3 
0x103dbae63: nopw %cs:(%rax,%rax) 

Vielen Dank im Voraus!

+1

Können Sie JSON teilen, die du erhältst? Ich nehme an, dass Sie ein Array von Objekten erhalten, also sollten Sie in 'NSArray' umwandeln. – Keenle

+0

Es war in der Tat eine Reihe von Objekten. Mit dem Ändern von NSDictionary zu NSArray ist das Problem gelöst. Danke für Ihre Hilfe! –

Antwort

6

Von URL http://localhost:3000/api/posts Ich gehe davon aus, dass Sie ein Array von Objekten zu erhalten, so Sie sollten das Ergebnis an NSArray übertragen.

-Code sollte sein:

var json = NSJSONSerialization.JSONObjectWithData(data, options: .MutableLeaves, error: &err) as NSArray 

jedoch wie durch Yatheesha erwähnt, können Sie gleich Null empfangen, so ist es besser, Nullable-Array zu werfen und prüfen Sie in if let...:

if let json = NSJSONSerialization.JSONObjectWithData(data, options: .MutableLeaves, error: &err) as? NSArray { 
    ... 
} 
1

In Ihrem Fall Daten können nil dann werden Sie nil von NSJSONSerialization.JSONObjectWithData() erhalten so Gießens führt geben zu abstürzen, starten

func loadData() { 
    let url = NSURL(string: "http://localhost:3000/api/posts") 
    let task = NSURLSession.sharedSession().dataTaskWithURL(url, completionHandler: {(data, response, error) in 
     var err: NSError? 
     if let json = NSJSONSerialization.JSONObjectWithData(data, options: .MutableLeaves, error: &err) as? NSArray { 

       //Valid NSArray object 
      } 
     else { 
      //NSArray is nil 
     } 
      }) 
     task.resume() 
     } 
+1

Vielen Dank für Ihre Hilfe, jetzt stürzt die App nicht mehr ab, aber Sie erhalten immer noch kein Ergebnis. Durch den Rat von Keenie funktioniert es jetzt. Danke auch für die schnelle Antwort! –

Verwandte Themen