如何在应用关闭时保存用户购物车? - swift
How can I save user cart on app close? - swift
我想在应用关闭时保存当前用户的购物车,这样用户就可以从相同的状态return。
我有这个 class:
class CarrinhoItem: NSObject, NSCoding {
let produto: Item
var qtd: Double
// MARK: - Init
init(_ produto: Item, _ qtd: Double) {
self.produto = produto
self.qtd = qtd
}
// MARK: - NSCoding
func encode(with aCoder: NSCoder) {
aCoder.encode(produto, forKey: "produto")
aCoder.encode(qtd, forKey: "qtd")
}
required init?(coder aDecoder: NSCoder) {
produto = aDecoder.decodeObject(forKey: "produto") as! Item
qtd = aDecoder.decodeDouble(forKey: "qtd")
}
}
我正在使用这些功能 return 并保存购物车:
class CarrinhoDao {
func save(_ Carrinho: [CarrinhoItem]) {
guard let caminho = recuperaCaminho() else { return }
do {
let dados = try NSKeyedArchiver.archivedData(withRootObject: Carrinho, requiringSecureCoding: false)
try dados.write(to: caminho)
} catch {
print(error.localizedDescription)
}
}
func recupera() -> [CarrinhoItem] {
guard let caminho = recuperaCaminho() else { return [] }
do {
let dados = try Data(contentsOf: caminho)
guard let CarrinhoSalvo = try NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(dados) as? Array<CarrinhoItem> else { return [] }
return CarrinhoSalvo
} catch {
print(error.localizedDescription)
return []
}
}
func recuperaCaminho() -> URL? {
guard let diretorio = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else { return nil }
let caminho = diretorio.appendingPathComponent("refeicao")
return caminho
}
}
我已经将功能保存在 AppDelegate 上:
CartService.currentCart = [CarrinhoItem1,CarrinhoItem2, ...]
fun applicationWillTerminate(_ application: UIApplication) {
CarrinhoDao().save(CartService.currentCart)
// Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
}
但我收到此错误:
unrecognized selector sent to instance 0x6000027f5780
The data couldn’t be written because it isn’t in the correct format.
编辑:
已解决为项目添加 nscoding class:
func encode(with aCoder: NSCoder) {
aCoder.encode(nome, forKey: "nome")
aCoder.encode(imagem, forKey: "imagem")
aCoder.encode(preco, forKey: "preco")
aCoder.encode(precoantes, forKey: "precoantes")
aCoder.encode(tipo, forKey: "tipo")
aCoder.encode(aval, forKey: "aval")
aCoder.encode(avalcount, forKey: "avalcount")
aCoder.encode(disponivel, forKey: "disponivel")
aCoder.encode(descricao, forKey: "descricao")
}
required init?(coder aDecoder: NSCoder) {
nome = aDecoder.decodeObject(forKey: "nome") as! String
imagem = aDecoder.decodeObject(forKey: "imagem") as! String
preco = aDecoder.decodeDouble(forKey: "preco")
precoantes = aDecoder.decodeObject(forKey: "precoantes") as! String
tipo = aDecoder.decodeObject(forKey: "tipo") as! String
aval = aDecoder.decodeInteger(forKey: "aval")
avalcount = aDecoder.decodeInteger(forKey: "avalcount")
disponivel = aDecoder.decodeInteger(forKey: "disponivel")
descricao = aDecoder.decodeObject(forKey: "descricao") as! String
}
Item
是自定义的 class,因此您也必须为此 class 使用 NSCoding
协议
我想在应用关闭时保存当前用户的购物车,这样用户就可以从相同的状态return。
我有这个 class:
class CarrinhoItem: NSObject, NSCoding {
let produto: Item
var qtd: Double
// MARK: - Init
init(_ produto: Item, _ qtd: Double) {
self.produto = produto
self.qtd = qtd
}
// MARK: - NSCoding
func encode(with aCoder: NSCoder) {
aCoder.encode(produto, forKey: "produto")
aCoder.encode(qtd, forKey: "qtd")
}
required init?(coder aDecoder: NSCoder) {
produto = aDecoder.decodeObject(forKey: "produto") as! Item
qtd = aDecoder.decodeDouble(forKey: "qtd")
}
}
我正在使用这些功能 return 并保存购物车:
class CarrinhoDao {
func save(_ Carrinho: [CarrinhoItem]) {
guard let caminho = recuperaCaminho() else { return }
do {
let dados = try NSKeyedArchiver.archivedData(withRootObject: Carrinho, requiringSecureCoding: false)
try dados.write(to: caminho)
} catch {
print(error.localizedDescription)
}
}
func recupera() -> [CarrinhoItem] {
guard let caminho = recuperaCaminho() else { return [] }
do {
let dados = try Data(contentsOf: caminho)
guard let CarrinhoSalvo = try NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(dados) as? Array<CarrinhoItem> else { return [] }
return CarrinhoSalvo
} catch {
print(error.localizedDescription)
return []
}
}
func recuperaCaminho() -> URL? {
guard let diretorio = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else { return nil }
let caminho = diretorio.appendingPathComponent("refeicao")
return caminho
}
}
我已经将功能保存在 AppDelegate 上:
CartService.currentCart = [CarrinhoItem1,CarrinhoItem2, ...]
fun applicationWillTerminate(_ application: UIApplication) {
CarrinhoDao().save(CartService.currentCart)
// Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
}
但我收到此错误:
unrecognized selector sent to instance 0x6000027f5780
The data couldn’t be written because it isn’t in the correct format.
编辑:
已解决为项目添加 nscoding class:
func encode(with aCoder: NSCoder) {
aCoder.encode(nome, forKey: "nome")
aCoder.encode(imagem, forKey: "imagem")
aCoder.encode(preco, forKey: "preco")
aCoder.encode(precoantes, forKey: "precoantes")
aCoder.encode(tipo, forKey: "tipo")
aCoder.encode(aval, forKey: "aval")
aCoder.encode(avalcount, forKey: "avalcount")
aCoder.encode(disponivel, forKey: "disponivel")
aCoder.encode(descricao, forKey: "descricao")
}
required init?(coder aDecoder: NSCoder) {
nome = aDecoder.decodeObject(forKey: "nome") as! String
imagem = aDecoder.decodeObject(forKey: "imagem") as! String
preco = aDecoder.decodeDouble(forKey: "preco")
precoantes = aDecoder.decodeObject(forKey: "precoantes") as! String
tipo = aDecoder.decodeObject(forKey: "tipo") as! String
aval = aDecoder.decodeInteger(forKey: "aval")
avalcount = aDecoder.decodeInteger(forKey: "avalcount")
disponivel = aDecoder.decodeInteger(forKey: "disponivel")
descricao = aDecoder.decodeObject(forKey: "descricao") as! String
}
Item
是自定义的 class,因此您也必须为此 class 使用 NSCoding
协议