2014-10-07 3 views
-1

Я пытаюсь получить и показать данные из api, но я продолжаю получать эту действительно раздражающую ошибку времени выполнения, и я не знаю, что происходит!Ошибка выполнения при загрузке и отображении данных JSON

ViewController файл:

import UIKit 


class ViewController: UIViewController { 
    @IBOutlet weak var valueLabel: UILabel! 


override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 
    //set corner radius of value label 
    var buttonLayer: CALayer = valueLabel.layer 
    buttonLayer.masksToBounds = true 
    buttonLayer.cornerRadius = 5.0 
    getCurrentCryptoData() 
} 

func getCurrentCryptoData() -> Void { 
    let apiURL = NSURL(string: "https://www.allcrypt.com/api?method=cmcmarketdata") 
    let sharedSession = NSURLSession.sharedSession() 
    let downloadTask: NSURLSessionDownloadTask = sharedSession.downloadTaskWithURL(apiURL, completionHandler: { (apiData: NSURL!, response: NSURLResponse!, error: NSError!) -> Void in 
     let dataObject = NSData(contentsOfURL: apiData) 
     let cryptoDictionary: NSDictionary = NSJSONSerialization.JSONObjectWithData(dataObject, options: nil, error: nil) as NSDictionary 
     let omcvalues = Current(cryptoDictionary: cryptoDictionary) 
     self.valueLabel.text = "\(omcvalues.omcvalue)" 

    }) 
    downloadTask.resume() 


     } 




override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 


} 

Мой файл 'current.swift':

import Foundation 
import UIKit 

struct Current { 

var omcvalue: Double 

init(cryptoDictionary: NSDictionary) { 
    let all = cryptoDictionary["return"] as NSDictionary 
    let markets = all["markets"] as NSDictionary 
    let omcvalues = markets["OMC/BTC"] as NSDictionary 

    omcvalue = omcvalues["low_sell"] as Double 



} 
} 

Кроме этого, является источником апи Я пытаюсь использовать: api

Я пытаясь добраться до значений «OMC» и сохранить свойство «low_sell», но во время работы я все время получаю ошибку во время выполнения. Интересно, правильно ли я обращаюсь к словарям?

ОБНОВЛЕНО ДОБАВИТЬ ИНФОРМАЦИЮ Ошибка, которую я получаю, является ошибкой EXC_BREAKPOINT. Теперь я знаю, что ищу подходящий каталог, как если бы я заменил 'low_sell' на 'label', все работает отлично, и запрос проходит и печатается. Только когда я переключаюсь на low_sell.

Код ошибки ниже:

libswiftCore.dylib`swift_dynamicCastObjCClassUnconditional: 
0x10af95980: pushq %rbp 
0x10af95981: movq %rsp, %rbp 
0x10af95984: pushq %rbx 
0x10af95985: pushq %rax 
0x10af95986: movq %rsi, %rcx 
0x10af95989: movq %rdi, %rbx 
0x10af9598c: xorl %eax, %eax 
0x10af9598e: testq %rbx, %rbx 
0x10af95991: je  0x10af959ac    ;  swift_dynamicCastObjCClassUnconditional + 44 
0x10af95993: movq 0x7f236(%rip), %rsi  ; "isKindOfClass:" 
0x10af9599a: movq %rbx, %rdi 
0x10af9599d: movq %rcx, %rdx 
0x10af959a0: callq 0x10af9846a    ; symbol stub for: objc_msgSend 
0x10af959a5: testb %al, %al 
0x10af959a7: movq %rbx, %rax 
0x10af959aa: je  0x10af959b3    ; swift_dynamicCastObjCClassUnconditional + 51 
0x10af959ac: addq $0x8, %rsp 
0x10af959b0: popq %rbx 
0x10af959b1: popq %rbp 
0x10af959b2: retq 
0x10af959b3: leaq 0xc158(%rip), %rax  ; "Swift dynamic cast failed" 
0x10af959ba: movq %rax, 0x87427(%rip)  ; gCRAnnotations + 8 
0x10af959c1: int3 
0x10af959c2: nopw %cs:(%rax,%rax) 
+3

и эта ошибка времени выполнения ...? –

+0

Вы должны предоставить более подробную информацию о том, какая у вас ошибка и в какой строке она встречается. – Antonio

ответ

0

В API вы размещаете, не "OMC/BTC" ключ, просто "OMC\/BTC". Это может быть исправлено классом JSONSerialization, но ваша проблема действительно неразрешима без дополнительной информации.

В результатах API ключ «low_sell» отображаются следующим образом:

"low_sell": "0.00008795", 

Таким образом, вы должны сначала гипс в String, а затем преобразовать в число. Это проще с NSString:

if let lowSellString = omcvalues["low_sell"] as? NSString { 
    omcvalue = lowSellString.doubleValue 
} 

Обратите внимание, что вы всегда должны проверить с выше let if рисунком, если ключ в словаре присутствует и содержит действительные данные. doubleValue безопасен в этом смысле, потому что он вернет 0, если он не сможет успешно сканировать строку.

+0

Я добавил дополнительную информацию, извините за это! – AlexCatch

+0

Добавлен больше ответа в ответ на ваше дополнение. – Mundi

Смежные вопросы