【问题标题】:How can i shuffle RLMResults in swift?我怎样才能快速洗牌 RLMResults?
【发布时间】:2015-07-06 04:50:48
【问题描述】:

知道如何为RLMResults 随机随机播放吗?我无论如何都找不到通过RLMSortDescriptor 来做这件事。

我尝试编写自己的交换算法,但它给了我错误(无法分配给这个表达式的结果*)。

func simpleRandomSwap(rlmobjects:RLMResults!) -> RLMResults! {
    if (rlmobjects != nil && rlmobjects.count > 0) {

        let indexcount = Int(rlmobjects.count)

        for (var i=0 ; i<indexcount; i++) {
            let randomUInt:UInt = UInt(arc4random_uniform(UInt32(indexcount)))
            let myuint = UInt(i)


            // simple swap
            var temp = rlmobjects.objectAtIndex(myuint)
            rlmobjects.objectAtIndex(randomUInt) = rlmobjects.objectAtIndex(myuint)
            rlmobjects.objectAtIndex(myuint) = temp


        } // end for loop

    }


    return rlmobjects
}

【问题讨论】:

  • 我认为你必须将你的 RLMResults 对象转换为 NSMutableArray 而不是改组它。
  • 有没有更直接的方法来实现这一点?转换为 NSMutableArray 需要另一个 for 循环,这会导致一些不必要的性能损失,IMO
  • 我也有同样的想法,但问题是 i) 与 NSSortDescriptor 不同,RLMSortDescriptor 不将 NSComparator 作为参数,因此您在获取数据时不能进行洗牌。 ii) RLMReults 不会让你在运行时替换它的对象。
  • 在 Objective-C 中,我会在一行代码中使用 KVC 将 RLMResults 转换为 NSMutableArray,如下所示 [[rlmobjects valueForKey:@"self"].mutableCopy,类似于 rlmobjects.valueForKey(“ self”) 不能快速实现?
  • 这可能对你有帮助:stackoverflow.com/questions/28847359/…

标签: ios swift realm


【解决方案1】:

首先快速说明:RLMResults 没有定义的顺序,除非它们通过 RLMSortDescriptor 排序。

相反,要随机排序,您有两种选择:

  1. 向您的对象架构添加一个整数属性,并为所有对象分配随机值。然后,您可以使用 RLMSortDescriptorRLMResults 对对象进行排序。

  2. 如上面cmets中提到的,将RLMObjects复制到一个数组中,并对其进行随机排序。

这是对RLMObject 的扩展,它可以做到这一点:

extension RLMResults {
    public func toShuffledArray<T>(ofType: T.Type) -> [T] {

        var array = [T]()

        for result in self {
            if let result = result as? T {
                array.append(result)
            }
        }

        let count = array.count

        if count > 1 {
            for i in 0..<(count - 1) {
                let j = Int(arc4random_uniform(UInt32(count - i))) + Int(i)
                swap(&array[i], &array[j])
            }
        }

        return array
    }
}

你可以这样称呼它:

let shuffled = results.toShuffledArray(TestObject.self)

【讨论】:

  • 将它们放在数组中的问题是集合失去了自动更新的功能。
  • 要处理自动更新,您需要向 Realm 实例添加一个通知块,该通知块可以使用新数据重新触发随机数组的生成。
【解决方案2】:

斯威夫特 5:

你可以使用默认方法:

let shuffled = results.shuffled()

【讨论】:

    猜你喜欢
    • 2014-11-03
    • 2011-09-10
    • 1970-01-01
    • 2014-01-02
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多