代码之家  ›  专栏  ›  技术社区  ›  Wizzardzz

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

  •  0
  • Wizzardzz  · 技术社区  · 8 年前

    这个周末我完成了我的第一个应用程序( 感谢您的堆栈溢出用户! )我目前正在优化代码。我已经修复了大多数重复和不安全的做法,但这一次让我陷入了困境。

    以下是当用户将给定加密货币添加到钱包中时,我如何将其所需的所有信息保存到核心数据中:

    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
        }
    }
    
    2 回复  |  直到 8 年前
        1
  •  2
  •   Sweeper    8 年前

    我认为应该为存储以下信息的元组类型创建类型别名:

    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

        2
  •  0
  •   Joakim Danielson    8 年前

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

    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
      }
    }