这个周末,我完成了我的第一个应用程序(感谢您,堆栈溢出用户!)我目前正在优化代码。我已经修复了大部分的副本和不安全的练习,但是这次我被困住了。
下面是当用户将一个给定的加密货币添加到他的钱包时,我需要的所有信息保存到Core数据中:
if addedCrypto == "Augur REP" {
if CoreDataHandler.saveObject(name: "Augur", code: "augur", symbol: "REP", placeholder: "REP Amount", amount: "0.00000000", amountValue: "0.0") {
for _ in CoreDataHandler.fetchObject()! {
}
}
}这对于一个密码来说非常方便,但我的应用程序支持其中的25个。目前,上面的行在我的代码中重复了24次,每一个不同的密码都重复一次。
我曾想过使用字典,可以将Augur REP保存为key,然后将(name: "Augur", code: "augur", ...")保存为value,但我不知道如何正确地做到这一点。
这里的解决方案是什么?
编辑:下面是saveObject(...)方法:
class func saveObject(name:String, code:String, symbol:String, placeholder:String, amount:String, amountValue:String) -> Bool {
let context = getContext()
let entity = NSEntityDescription.entity(forEntityName: "CryptosMO", in: context)
let managedObject = NSManagedObject(entity: entity!, insertInto: context)
managedObject.setValue(name, forKey: "name")
managedObject.setValue(code, forKey: "code")
managedObject.setValue(symbol, forKey: "symbol")
managedObject.setValue(placeholder, forKey: "placeholder")
managedObject.setValue(amount, forKey: "amount")
managedObject.setValue(amountValue, forKey: "amountValue")
do {
try context.save()
return true
} catch {
return false
}
}发布于 2018-03-26 16:14:24
我认为您应该为存储这些信息的元组类型创建一个类型别名:
typealias CryptosMOInfo = (name:String, code:String, symbol:String, placeholder:String, amount:String, amountValue:String)然后你就可以创建一个这样的字典:
let cryptosDictionary: [String, CryptosMOInfo] = [
"Augur REP": (name: "Augur", code: "augur", symbol: "REP", placeholder: "REP Amount", amount: "0.00000000", amountValue: "0.0"),
// ...
]可以将saveObject方法的签名更改为:
static func saveOject(cryptosInfo: CryptosMOInfo) -> Bool只需记住访问cryptosInfo
managedObject.setValue(cryptosInfo.name, forKey: "name")
managedObject.setValue(cryptosInfo.code, forKey: "code")
managedObject.setValue(cryptosInfo.symbol, forKey: "symbol")
managedObject.setValue(cryptosInfo.placeholder, forKey: "placeholder")
managedObject.setValue(cryptosInfo.amount, forKey: "amount")
managedObject.setValue(cryptosInfo.amountValue, forKey: "amountValue")如果不喜欢类型别名,也可以将其转换为struct。
发布于 2018-03-26 16:38:35
为什么不直接使用托管对象子类呢?在添加新密码时创建一个新实例,然后立即保存所有已加载/更新的对象。
if addedCrypto == "Augur REP" {
let crypto = CryptosMO(context: CoreDataHandler.getContext())
crypto.name = "Augur"
crypto.code = "augur"
// and so on
}由于这段代码似乎是相同的,所以您可以为所支持的每个密码创建工厂方法,从而使代码更易于阅读。
if addedCrypto == "Augur REP" {
_ = CryptoFactory.createAugur()
}
class CryptoFacory {
static func CreateAugur() -> CryptoMO {
return create(name: "Augur", code: "augur",...
}
//... other crypto factory methods
private static create(name: String, code: String,...) -> CryptoMO {
let crypto = CryptosMO(context: CoreDataHandler.getContext())
crypto.name = name
crypto.code = code
//...
return crypto
}那么CoreDataHandler中的save方法就不需要任何参数,因为加密实例已经在托管对象上下文中了。所以很简单
func save() -> Bool {
let context = getContext()
do {
try context.save()
return true
} catch {
return false
}
}https://stackoverflow.com/questions/49495650
复制相似问题