首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将许多不同对象保存到核心数据的最佳方法

将许多不同对象保存到核心数据的最佳方法
EN

Stack Overflow用户
提问于 2018-03-26 15:52:13
回答 2查看 60关注 0票数 0

这个周末,我完成了我的第一个应用程序(感谢您,堆栈溢出用户!)我目前正在优化代码。我已经修复了大部分的副本和不安全的练习,但是这次我被困住了。

下面是当用户将一个给定的加密货币添加到他的钱包时,我需要的所有信息保存到Core数据中:

代码语言:javascript
复制
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(...)方法:

代码语言:javascript
复制
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
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-03-26 16:14:24

我认为您应该为存储这些信息的元组类型创建一个类型别名:

代码语言:javascript
复制
typealias CryptosMOInfo = (name:String, code:String, symbol:String, placeholder:String, amount:String, amountValue:String)

然后你就可以创建一个这样的字典:

代码语言:javascript
复制
let cryptosDictionary: [String, CryptosMOInfo] = [
    "Augur REP": (name: "Augur", code: "augur", symbol: "REP", placeholder: "REP Amount", amount: "0.00000000", amountValue: "0.0"),
    // ...
]

可以将saveObject方法的签名更改为:

代码语言:javascript
复制
static func saveOject(cryptosInfo: CryptosMOInfo) -> Bool

只需记住访问cryptosInfo

代码语言:javascript
复制
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

票数 2
EN

Stack Overflow用户

发布于 2018-03-26 16:38:35

为什么不直接使用托管对象子类呢?在添加新密码时创建一个新实例,然后立即保存所有已加载/更新的对象。

代码语言:javascript
复制
if addedCrypto == "Augur REP" {
  let crypto = CryptosMO(context: CoreDataHandler.getContext())
  crypto.name = "Augur"
  crypto.code = "augur"
  // and so on
}

由于这段代码似乎是相同的,所以您可以为所支持的每个密码创建工厂方法,从而使代码更易于阅读。

代码语言:javascript
复制
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方法就不需要任何参数,因为加密实例已经在托管对象上下文中了。所以很简单

代码语言:javascript
复制
func save() -> Bool {
  let context = getContext()
  do {
    try context.save()
    return true
  } catch {
    return false
  }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49495650

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档