【问题标题】:How to use random and limit in realm如何在领域中使用随机和限制
【发布时间】:2015-08-24 01:54:09
【问题描述】:

我在 swift 中使用了 realm.io。 我有 6 个或更多数据。 我想随机选择 4 个数据。

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

【问题讨论】:

    标签: ios swift realm


    【解决方案1】:

    斯威夫特 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()
    

    【讨论】:

      【解决方案2】:

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

      您基本上可以像这样创建结果扩展(来自领域库的预定义类):

      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-loop 为某些功能性 Swift 函数进行切片...

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-09-21
            • 2013-10-05
            • 1970-01-01
            • 2019-12-21
            • 1970-01-01
            相关资源
            最近更新 更多