write ToFile
1、存入的是基本类型,例如:NSNumber (NSInteger, Float, Double), NSString, NSArray, NSDictionary, Bool, NSDate。。。。等
2、写入的数据不能为自定义类型或者NUll,不过自定义类型可以通过归档讲数据转化为NSDate类型
根据以上第二条,通过抓包,我们存入的数据包含,null,所以一直 存入失败,可以直接把类型转为 string,防止出错
//数组转json
func getJSONStringFromArray(array: [[String: Any]]) -> String {
if (!JSONSerialization.isValidJSONObject(array)) {
it_print("无法解析出JSONString")
return ""
}
if let data = try? JSONSerialization.data(withJSONObject: array, options: []) as Data {
let JSONString = String(data:data, encoding: .utf8)
return JSONString ?? ""
}
return ""
}
//JSONString转换为数组
func getArrayFromJSONString(jsonString:String) -> [[String: Any]] {
if let jsonData: Data = jsonString.data(using: .utf8) {
let array = try? JSONSerialization.jsonObject(with: jsonData, options: .mutableContainers) as? [[String : Any]]
return array ?? [[:]]
}
return [[:]]
}
因为我们存储的数据量比较大,做首页缓存,所以不使用 NSUserDefault
原因:
原理上看NSUserDefaults 其实是在操作一个 plist 文件。读取NSUserDefaults值的时候会默认在内存中缓存下来一份,所以NSUserDefaults的读取速度比较快。正常情况下,我们后面对NSUserDefaults的读取都是从内存中读取的,经测试删除.plist文件后,依然可以正常读取,基本可以证明这一点。NSUserDefaults 的存储目录是在/Library/Preferences下的一个.plist文件,该路径可通过配置实现iTunes共享文件。可被iTunes备份。
1: 即使只是修改一个 key 都会 load 整个文件,不适合存储大量数据。
2:NSUserDefaults是保存成文本格式的,容易被破解,解析效率也比较低。所以数据太大的时候,解析起来就慢了。
3:NSUserDefaults你每次同步都要全写,打开要全读。小数据连同大数据一起操作了,IO以及内存都不划算,况且还有解析、序列化的成本。大数据建议弄出去,别跟NSUserDefaults这种经常存取的弄一起。
4:要注意的是NSUserDefault存储的都是不可变(immutable)的数据,就算是将NSMutableArray存到NSUserDefault,读取出来之后还是会变成NSArray类型的。