如何把Realm中一个class的所有对象放到一个数组中

How to get all objects of a class in Realm to an array

目前我正在使用这个:

    var matchedUsersFromRealm = MatchedUser.allObjects()
    var matchedUsersInRealm = RLMArray(objectClassName: MatchedUser.className())
    matchedUsersInRealm.removeAllObjects()
    matchedUsersInRealm.addObjects(matchedUsersFromRealm)

但它看起来很麻烦,而不是像它应该(或已经这样做?)那样把它排成一行。也许有更好的方法?

PS,我正在做一个混合项目,不知何故我只能使用 Objective-C 版本并将其桥接到我的 swift 项目。所以 Realm().objects() 不可用,即使它 returns 结果不是数组。

您可以在 1 行中获取 User 的所有对象:

let matchedUsers = Realm().objects(MatchedUser)

因为 RLMResults 是一个延迟加载数组。所以如果你想 return 一个数组,只需要为 Results 写一个扩展。 示例:

extension Result {
  func toArray() -> [T] {
    let newArray: [T] = []
    // At here you should append the value from self into newArray
    ...
    return newArray
  }
}

RLMArrays 旨在表示对多关系。 RLMResults 表示数据库查询的结果。但是,如果您希望获得一个普通的旧 Swift 数组(并且可以接受使用它与 RLMResults 的性能权衡),您可以执行 map(MatchedUser.allObjects()) { [=13=] }

您可以添加这些扩展:

import Foundation
import RealmSwift

extension Results {

    func toArray() -> [T] {
        return self.map{[=10=]}
    }
}

extension RealmSwift.List {

    func toArray() -> [T] {
        return self.map{[=10=]}
    }
}

然后在抓取的时候:

do {
    let realm = try Realm()
    let objs = realm.objects(MyObjType).toArray() 
    // ...

} catch _ {
    // ...
}

(如果您使用的是 Swift pre-2.0,请删除 do try catch)

请注意,这会立即将所有内容加载到内存中,这在某些情况下可能是不希望的。如果你在后台获取,这是必需的,因为 Realm 目前不支持在那之后使用主线程中的对象(在这种情况下你还必须将数组映射到非 Realm 对象)。

我更喜欢添加一个助手 class 来使用泛型保存和检索任何类型的对象。

class RealmHelper {
    static func saveObject<T:Object>(object: T) {
        let realm = try! Realm()
        try! realm.write {
            realm.add(object)
        }
    }
    static func getObjects<T:Object>()->[T] {
        let realm = try! Realm()
        let realmResults = realm.objects(T.self)
        return Array(realmResults)

    }
    static func getObjects<T:Object>(filter:String)->[T] {
        let realm = try! Realm()
        let realmResults = realm.objects(T.self).filter(filter)
        return Array(realmResults)

    }
}