我试图从 Crashlytics 找出一个 NSOperationQueue 错误

A NSOperationQueue error I'm trying to figure out from Crashlytics

今天早上我在 Crashlytics 上遇到了这个错误,我无法弄清楚问题出在哪里。得到你的意见会很棒。我认为这很可能是多线程问题。但我无法准确指出它是什么。

编辑:我挖得更深一点,这是失败的代码:

此外,我发现错误是:

无法将“__NSSingleObjectArrayI”类型的值 (0x1aa60bca0) 转换为 'NSMutableArray' (0x1aa60bd90)。 2016-09-22 08:29:34.136764 GrabbnGo[4204:822290] 无法将类型 '__NSSingleObjectArrayI' (0x1aa60bca0) 的值转换为 'NSMutableArray' (0x1aa60bd90).

这一直以来都运行良好,但突然出现问题,应用程序已经在商店中了:/

json = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions()) as? [String: AnyObject]
            let str = NSString(data: data!, encoding: NSUTF8StringEncoding)
            print(str)
            let OrderDictionary = json as NSDictionary
            let result = OrderDictionary.objectForKey("result") as! NSMutableArray

好的,这种有一个独特的答案。基本上,您在滥用 NSJSONSerialization,这是一个最终会害了您的定时炸弹错误。

根据文档:

https://developer.apple.com/reference/foundation/jsonserialization

All objects are instances of NSString, NSNumber, NSArray, NSDictionary, or NSNull.

这是一句非常简单明了的句子。你应该尊重它。它只说 NSMutableArray,只说 NSArray。 JSON 解析器正在使用它选择的 NSArray 的任何兼容(子类)对象。如果数组中只有一项,内部类型 __NSSingleObjectArray 似乎效率更高,可能在速度和内存方面都是如此。

几乎可以肯定服务器(或客户行为)发生了变化,因此 result 现在(经常?有时?总是?)只有 1 个项目,所以 JSON 解析器做出了一个你不应该关心的不同选择。

您需要做的就是将其更改为 NSArray 并根据需要从中构建一个 NSMutableArray

let myJSONParsedArray: NSArray = ...
let myMutableArray = NSMutableArray(myJSONParsedArray)

但首先要了解为什么强制解包如此危险,尤其是在网络代码环境中,当您根本不能信任任何数据时,无论是类型、价值还是恶意,永远!!