【问题标题】:ignored properties are lost when fetched from RLMResult with objectAtIndex使用 objectAtIndex 从 RLMResult 获取时,忽略的属性会丢失
【发布时间】:2014-11-20 10:29:56
【问题描述】:

我有这个模型:

enum PhotoState: String {
  case New = "New"
  case Downloaded = "Downloaded"
  case Failed = "Failed"
}

class Photo: RLMObject {
  dynamic var id = 0
  dynamic var name = ""
  dynamic var imageURLString = ""

  var state = PhotoState.New

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

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

我在表格视图中展示这个:

override func viewDidLoad() {
    super.viewDidLoad()

    photos = Photo.allObjects()
}

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    // Return the number of rows in the section.
    if let count = photos?.count {
        return Int(count)
    }
    return 0
}

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    if let photo = photos?.objectAtIndex(UInt(indexPath.row)) as? Photo {
        downloadPhoto(photo, indexPath: indexPath)
    }
}

func downloadPhoto(photo: Photo, indexPath: NSIndexPath) {
    // Fake Download
    switch photo.imageURLString.lastPathComponent {
    case "7.png":
        photo.state = .Failed
    default:
        photo.state = .Downloaded
    }
    tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: .Automatic)
}

如果我点击一行,该行应该会更新并具有新的状态,但照片记录的 state 属性又回到了 .New。

RLMResult 的 objectForIndex 是否初始化了一个新的模型实例?

【问题讨论】:

    标签: ios swift realm


    【解决方案1】:

    每当一个对象存储在 Realm 中时,只有未被“忽略”的属性会被存储和再次检索。每当您从 Realm 获取对象时,“被忽略”的属性只会出现默认值。

    因此,当您例如有一个独立的对象,最初在 Realm 之外使用。然后,当您想将其添加到 Realm 时,您希望不存储某些属性。

    领域对象的属性不存储在对象本身中。它们被直接检索/存储在数据库中,并且对象只是充当代理。

    【讨论】:

    • 这意味着 RLMResults.objectAtIndex 从数据库中获取模型?所以我必须这样做:var photos = [Photo]()for photo in Photo.allObjects() { photos.append(photo as Photo) }
    • 是的,objectAtIndex 获取模型。忽略的属性最好用于转换模型中的某些保存属性,不应用于保存状态。您最好将整数保存在属性savedState 中并为state 创建一个getter,使用它来创建正确的枚举。
    • 是的 - 取决于您所说的“获取”。没有从数据库到对象的数据副本。对象和数据库似乎是一回事——没有将值复制到对象的属性中;仅代理。
    • 确实,每次 RLMResults 获取相同的数据库条目时,都会是不同的对象实例。所以内存缓存的 UIImage 会丢失。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-31
    相关资源
    最近更新 更多