今天早上我在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
答案 0 :(得分:1)
好的,这种方式有一个独特的答案。基本上,你是在滥用NSJSONSerialization
,这是一个时间炸弹错误,最终会让你陷入困境。
根据文件:
https://developer.apple.com/reference/foundation/jsonserialization
所有对象都是NSString,NSNumber,NSArray,NSDictionary或NSNull的实例。
这是一个非常简单明了的句子。你应该尊重它。它没有说明NSMutableArray
,只有NSArray
。 JSON解析器正在使用它所选择的NSArray
的任何兼容(子类)对象。如果数组中只有一个项目,那么内部类型__NSSingleObjectArray
似乎效率更高,可能在速度和内存方面都有效。
服务器(或客户行为)几乎肯定会发生变化,现在result
(通常?有时?总是?)只有1项,所以JSON解析器做出了不同的选择不应该关心。
您需要做的就是将其更改为NSArray
并根据需要构建NSMutableArray
:
let myJSONParsedArray: NSArray = ...
let myMutableArray = NSMutableArray(myJSONParsedArray)
但首先要了解为什么强行展开是如此危险,特别是在网络代码环境中,当你完全不信任任何数据时,关于类型,价值和恶意,永远都是!!