如何在领域中使用随机和限制

时间:2015-08-24 01:54:10

标签: ios swift realm

我在swift中使用了realm.io。 我有6个以上的数据。 我想选择随机4数据。

var words: Results<Word> {
    get {
        return Realm().objects(Word).filter("Limit(4)")
    }
}

4 个答案:

答案 0 :(得分:3)

Swift 2

这是我尝试创建一个随机函数。

就我而言,我必须从Realm DB中检索一个随机图像并显示它。所以我在Image类中创建了一个静态函数。

class Image: Object {
    dynamic var filename = ""

    static func randomImage() -> Image? {
        let images = uiRealm.objects(Image)
        if images.count == 0 {
            return nil
        }
        let index = Int(arc4random_uniform(UInt32(images.count)))
        return images[index]
    }
}

//Get a random image
Image.randomImage()

至于限制功能,我并不真正看到它的必要性,但这是一种可行的方法:

class Image: Object {
    dynamic var filename = ""

    static func limitImages(limit: Int) -> [Image]? {
        let images = uiRealm.objects(Image)
        if images.count == 0 {
            return nil
        }
        var limitImages: [Image] = []
        for iter in 0..<limit {
            if images.count < iter {
                break
            } else {
                limitImages.append(images[iter])
            }
        }
        return limitImages
    }
}

//Get 5 images
Image.limitImages(5)

您可以将这些功能用作Realm扩展,执行以下操作:

extension Realm {
    func random(type: Object.Type) -> Object? {
        let objects = uiRealm.objects(type)
        if objects.count == 0 {
            return nil
        }
        let index = Int(arc4random_uniform(UInt32(objects.count)))
        return objects[index]
    }
}

//Get a random Animal
let myRealm = try! Realm()
myRealm.random(Animal)

或结果对象版本

extension Results {
    func random() -> T? {
        if self.count == 0 {
            return nil
        }
        let index = Int(arc4random_uniform(UInt32(self.count)))
        return self[index]
    }
}

//Get a random row from any Object
let randomObject = myRealm.objects(Person).random()

答案 1 :(得分:2)

以数组的形式获取有限的域结果:

您基本上可以创建结果扩展(Realm库中的预定义类),如下所示:

import RealmSwift
import ObjectMapper


extension Results{

    func get <T:Object> (offset: Int, limit: Int ) -> Array<T>{
        //create variables
        var lim = 0 // how much to take
        var off = 0 // start from
        var l: Array<T> = Array<T>() // results list

        //check indexes
        if off<=offset && offset<self.count - 1 {
            off = offset
        }
        if limit > self.count {
            lim = self.count
        }else{
            lim = limit
        }

        //do slicing
        for i in off..<lim{
            let dog = self[i] as! T
            l.append(dog)
        }

        //results
        return l
    }
}

然后用法就是这样:

let realm = try! Realm()
realm.objects(NewsDb).filter("homepageCategory = 1").get(0, limit: 5)

PS。这是临时解决方案。优化是如果你替换for循环来为一些函数Swift函数做切片......

答案 2 :(得分:1)

Realm目前不支持直接限制,但您可以在0..<wordCount范围内生成4个随机整数并使用它们来索引结果?

答案 3 :(得分:0)

Realm不支持随机对象拾取,但是您可以使用名为randomElement()的函数,该函数将从给定列表中返回随机对象。如果列表为空,则该方法将返回nil。来源=> https://developer.apple.com/documentation/swift/array/2994747-randomelement

在答案上方拾取特定数量的对象将起作用