2014-07-25 8 views
6

RubyMotion ile bir uygulama oluşturduktan sonra, bu uygulama Swift ile xCode uygulamasında uygulamalar geliştirme konusundaki ilk deneyimim.Hızlı dinamik dökümü, HTTP GET isteği ile başarısız oldu

Rails API'sındaki tüm yayınları almak için aşağıdaki kodu kullanıyorum, istek başarılı ancak JSON'u ayrıştırma bir hata veriyor.

kodu:

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() 
} 

hatası: önceden

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) 

teşekkürler! nil o zaman bu kadar çökmesine yol döküm tip NSJSONSerialization.JSONObjectWithData() den nil alacak davanız verilerde

+1

Eğer JSON paylaşabilir miyim o Aldığınız? Bir dizi nesne aldığınızı varsayalım, yani 'NSArray' 'a atmalısınız. – Keenle

+0

Gerçekten bir dizi nesneydi. NSDrup’ı NSArray’a değiştirerek problem çözüldü. Yardım ettiğin için teşekkür ederim! –

cevap

6

deneyin Sonucu NSArray'a göndermelisiniz.

Kod olmalıdır:

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

Yatheesha tarafından belirtildiği gibi bunun null diziye döküm ve if let... kontrol etmek daha iyidir, böylece Ancak, nil alabilir:

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

olabilir, bu nedenle, nesnelerden dizisi alır ben varsayabiliriz URL'nizden http://localhost:3000/api/posts itibaren bu

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

Yardımlarınız için teşekkürler, artık uygulama artık çöküyor değil, yine de bir sonuç alamıyor. Keenie'nin tavsiyesini kullanarak, şimdi çalışıyor. Ayrıca hızlı cevap için teşekkürler! –