NSURLSession从Swift崩溃

时间:2015-08-05 08:57:00

标签: swift ios8 crash nsurlsession

我有一个使用NSURLSession的简单类。

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的样本看起来非常像我的工作。我尝试使用共享会话而不是创建新会话,但这也没有帮助。

导致此次崩溃的原因是什么?

1 个答案:

答案 0 :(得分:0)

似乎JSON实际上并不是所有字符串 - 我脑力激荡,其中一个实际上是一个数字。

问题中的真正问题是,当处理强制转换失败的问题时,Swift完全没有价值。您不仅不会在运行时获得任何可以处理或恢复的有用错误,而且在发生时显示的调试信息完全是误导性的,并且指向完全错误的位置。你只需在一个函数中得到一个陷阱而没有带有错误的callstack的符号。