如何将Realm中类的所有对象都添加到数组中

时间:2015-08-02 03:05:54

标签: swift realm

目前我正在使用它:

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

但它看起来很麻烦,而不仅仅是它应该(或做到了?)。也许有更好的方法?

PS,我正在研究混合项目,不知怎的,我只能使用Objective-C版本并将其桥接到我的快速项目中。因此Realm()。objects()不可用,即使它返回的结果不是数组。

5 个答案:

答案 0 :(得分:19)

您可以添加以下扩展程序:

import Foundation
import RealmSwift

extension Results {

    func toArray() -> [T] {
        return self.map{$0}
    }
}

extension RealmSwift.List {

    func toArray() -> [T] {
        return self.map{$0}
    }
}

然后拿取:

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

} catch _ {
    // ...
}

(如果您使用Swift pre-2.0,请删除尝试捕捉)

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

答案 1 :(得分:1)

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

let matchedUsers = Realm().objects(MatchedUser)

答案 2 :(得分:1)

RLMArray用于表示多对多关系。 RLMResults用于表示数据库查询的结果。但是,如果您正在寻找一个普通的Swift阵列(并且可以使用与RLMResults相比的性能权衡),那么您可以map(MatchedUser.allObjects()) { $0 }

答案 3 :(得分:0)

因为RLMResults是一个延迟加载数组。因此,如果要返回数组,只需为结果编写扩展名即可。 例如:

{{1}}

答案 4 :(得分:0)

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

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)

    }
}