2015-08-05 2 views
0

У меня есть простой класс, который использует NSURLSession.Сбой NSURLSession от Swift

class test { 
    let session = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration()); 
    func f() { 
     dispatch_async(dispatch_get_global_queue(Int(QOS_CLASS_UTILITY.value), 0), {() -> Void in 
      var task = self.session.dataTaskWithRequest(request, completionHandler: { (data: NSData!, response: NSURLResponse!, error: NSError!) -> Void in 
       if error != nil { 
        // cry 
        return; 
       } 
       var error: NSError? = nil; 
       var dict = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.allZeros, error: &error) as! Dictionary<String, String>; 
       // use dict 
      }); 
      task.resume(); 
     }); 
    } 

Когда я пытаюсь десериализовать данные как JSON, приложение аварийно завершает работу.

Я определил, что данные, по-видимому, имеют правильную длину, но содержимое выглядит как мусор в отладчике, поэтому мне кажется, что переданный объект данных не работает. Кроме того, я подозреваю, что некоторые удары стека я могу пройти через этот обработчик завершения и увидеть, что это попытка десериализации данных, которые сбой, но когда происходит фактический сбой, стек в отладчике ничего не говорит о обработчике завершения или любом из моих код.

Я видел несколько примеров использования NSURLSession, которые выглядят почти так же, как мои, которые просто работают. Я попытался использовать общий сеанс вместо создания нового, но это тоже не помогло.

Что вызывает этот крах?

+0

Это происходит с определенным URL-адресом? Я имею в виду с возвратом определенного типа данных. Я не говорю «Swift», но разве это из-за «ошибки var», которую вы переопределили? (включен в обработчике 'URLSession' и том, который вы хотите использовать для' NSJSONSerialization')? – Larme

+0

Прежде всего, получите и прочитайте ошибки. Во-вторых, проверьте, действительно ли объект JSON 'Dictionary '. Если он содержит по крайней мере внутренний массив или словарь, это скорее «Словарь ' – vadian

+0

, попробуйте объявить сеанс внутри функции f. есть хороший шанс, что вы вызываете session.dataTaskWithRequest. 2-й раз до того, как первый раз закончился, и это может привести к сбою. –

ответ

0

Похоже, что JSON не был на самом деле все струны - я был мозгом, и один из них был фактически числом.

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

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