此解决方案使用 userdefault,对于大量数据,它不是一个好的选择。
struct p: Codable {
var imgData: Data
var name: String
public init(img: UIImage,name: String) {
self.imgData = img.pngData()!
self.name = name
}
}
像这样使用 Userdefault Helper 来存储和获取数据:
class UserDefaultsHandler: NSObject {
static let shared = UserDefaultsHandler()
let userDefaults: UserDefaults?
private override init() {
userDefaults = UserDefaults.standard
}
func set<T>(obj: T?, forKey key: String) where T: Encodable {
guard let tempValue = obj else {
userDefaults?.set(nil, forKey: key)
return
}
let jsonEncoder = JSONEncoder()
guard let jsonData = try? jsonEncoder.encode(tempValue) else {
userDefaults?.set(nil, forKey: key)
return
}
let json = String(data: jsonData, encoding: .utf8)
userDefaults?.set(json, forKey: key)
}
func get<T: Decodable>(key: String, type: T.Type) -> T? {
let jsonString = userDefaults?.object(forKey: key) as? String
let jsonData = jsonString?.data(using: .utf8)
let decoder = JSONDecoder()
return try? decoder.decode(type, from: jsonData ?? Data())
}
}
// 设置获取示例
let arr = [p(img: img, name: "Apple"), p(img: img, name: "Mango"), p(img: img, name: "Pinapple")]
UserDefaultsHandler.shared.set(obj: arr, forKey: "ImageArray")
guard let arr = UserDefaultsHandler.shared.get(key: "ImageArray", type: [p].self) else { return }