NSURLSession 从 Swift 崩溃
NSURLSession crashing from Swift
我有一个使用 NSURLSession 的简单 class。
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 的示例,它们看起来与我的完全一样,而且可以正常工作。我尝试使用共享会话而不是创建一个新会话,但这也无济于事。
导致此崩溃的原因是什么?
似乎 JSON 实际上并不是所有的字符串——我脑补了一下,其中一个实际上是一个数字。
题中真正的问题是Swift在处理强制转换失败的问题时完全没有价值。您不仅不会在运行时收到任何可以处理或从中恢复的有用错误,而且出现错误时显示的调试信息完全具有误导性,并且指向完全错误的位置。您只是在没有符号且调用堆栈错误的函数中陷入陷阱。
我有一个使用 NSURLSession 的简单 class。
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 的示例,它们看起来与我的完全一样,而且可以正常工作。我尝试使用共享会话而不是创建一个新会话,但这也无济于事。
导致此崩溃的原因是什么?
似乎 JSON 实际上并不是所有的字符串——我脑补了一下,其中一个实际上是一个数字。
题中真正的问题是Swift在处理强制转换失败的问题时完全没有价值。您不仅不会在运行时收到任何可以处理或从中恢复的有用错误,而且出现错误时显示的调试信息完全具有误导性,并且指向完全错误的位置。您只是在没有符号且调用堆栈错误的函数中陷入陷阱。