【发布时间】:2015-08-24 01:54:09
【问题描述】:
我在 swift 中使用了 realm.io。 我有 6 个或更多数据。 我想随机选择 4 个数据。
var words: Results<Word> {
get {
return Realm().objects(Word).filter("Limit(4)")
}
}
【问题讨论】:
我在 swift 中使用了 realm.io。 我有 6 个或更多数据。 我想随机选择 4 个数据。
var words: Results<Word> {
get {
return Realm().objects(Word).filter("Limit(4)")
}
}
【问题讨论】:
这是我创建随机函数的尝试。
就我而言,我必须从 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()
【讨论】:
以数组形式获取有限领域结果:
您基本上可以像这样创建结果扩展(来自领域库的预定义类):
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 函数进行切片...
【讨论】:
Realm 目前不支持直接限制,但是您可以在0..<wordCount 范围内生成 4 个随机整数并使用它们来索引结果?
【讨论】:
Realm 不支持随机对象拾取,但您可以使用名为 randomElement() 的函数,它将从给定列表中返回一个随机对象。如果列表为空,该方法将返回 nil。来源 => https://developer.apple.com/documentation/swift/array/2994747-randomelement
对于拾取特定数量的对象以上答案将起作用
【讨论】: