我试图从 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)
但首先要了解为什么强制解包如此危险,尤其是在网络代码环境中,当您根本不能信任任何数据时,无论是类型、价值还是恶意,永远!!
今天早上我在 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)
但首先要了解为什么强制解包如此危险,尤其是在网络代码环境中,当您根本不能信任任何数据时,无论是类型、价值还是恶意,永远!!