在将rlmobject与nil进行比较时使用realm的错误访问代码1

时间:2014-12-20 03:53:56

标签: ios xcode swift realm

我有一个同步引擎,其服务器遵循此代码,用于创建更新和删除的对象

let lastSynchronizationDate = (NSUserDefaults.standardUserDefaults().objectForKey("com.fridge.sync") as [String: NSDate])["skin"]!
    query.whereKey("updatedAt", greaterThanOrEqualTo: lastSynchronizationDate)
    query.findObjectsInBackgroundWithBlock { (remoteSkins, error) -> Void in
      if error != nil {
        return
      }
      if remoteSkins.isEmpty {
        return
      }
      RLMRealm.defaultRealm().transactionWithBlock {
        let deletedSkins = (remoteSkins as [PFObject]).filter {
          $0["state"] as Int == 0
          }.map {
            Skin(forPrimaryKey: $0["color"])
          }.filter {
            $0 != nil
          }.map {
            $0!
        }
        let createdSkins = (remoteSkins as [PFObject]).filter {
          $0["state"] as Int != 0
          }.filter {
            let skin = Skin(forPrimaryKey: $0["color"])
            println(skin.name)
            return skin == nil
          }.map { (remoteSkin) -> Skin in
            let remoteSkinModel = RemoteSkinModel(remoteSkin)
            let skin = Skin()
            skin.skinModel = remoteSkinModel // Error
            return skin
        }
        let updatedSkins = (remoteSkins as [PFObject]).filter {
          $0["state"] as Int != 0
          }.map {
            ($0, Skin(forPrimaryKey: $0["color"]))
          }.filter {
            $0.1 != nil
          }.map {
            $0.1.skinModel = RemoteSkinModel($0.0)
        }
        RLMRealm.defaultRealm().deleteObjects(deletedSkins)
        RLMRealm.defaultRealm().addObjects(createdSkins)
      }
    }

我的皮肤模特:

class Skin: RLMObject {
  dynamic var name: String = ""
  dynamic var hexString: String = ""

  var skinModel: SkinModel! {
    didSet {
      name = skinModel.name ?? oldValue.name ?? ""
      hexString = skinModel.hexString ?? oldValue.name ?? ""
    }
  }

  override class func primaryKey() -> String {
    return "hexString"
  }

  override class func ignoredProperties() -> [AnyObject] {
    return ["skinModel"]
  }

  func save() {

  }
}

protocol SkinModel {
  var name: String { get }
  var hexString: String { get }
}

class RemoteSkinModel: SkinModel {
  let remoteSkin: PFObject
  let name: String
  let hexString: String

  init(_ remoteSkin: PFObject) {
    self.remoteSkin = remoteSkin
    self.name = remoteSkin["name"] as? String ?? ""
    self.hexString = remoteSkin["color"] as? String ?? ""
  }
}

第一个引擎运行一切顺利,但下次在比较如果realm对象在createdSkins的代码中是否为nil时,它会弹出错误的访问错误。 知道为什么会这样吗? 提前致谢

1 个答案:

答案 0 :(得分:0)

如果强制skin成为可选项,会发生什么?

let skin: Sin? = Skin(forPrimaryKey: $0["color"])
if let skin = skin {
    println(skin.name)
}
return skin == nil

我认为Swift编译器可能会阻止检查为零,因为Skin(forPrimaryKey:)应该是一个可用的初始化程序,但Realm不能这样标记(只有Apple代码可以有这些)。

如果这不是问题,请告诉我们,我们会一起排除故障。 (我在Realm工作)。