【问题标题】:Random results from NSFetchedResultsController来自 NSFetchedResultsController 的随机结果
【发布时间】:2013-07-04 12:06:27
【问题描述】:

我的实体中有一些数据。如何以随机顺序获取所有条目。即我想一次又一次地洗牌所有条目。

我在这里找到了这个问题的解决方案:Shuffling the results from an NSFetchedResultsController。但我想得到NSFetchedResultsController 的结果。有任何想法吗?也许使用NSPredicateNSSortDescriptor

【问题讨论】:

  • 想要颠覆排序需要什么 FRC?只是变化检测?另一个问题已经提出了一些建议的解决方案,您尝试了哪些,它们是如何不起作用的?
  • 使用NSPredicate 的一些优雅的解决方案。如果我将 nil 设置为 NSFetchedRequest.predicate 我会看到所有条目,但这些结果总是以相同的顺序排列。
  • 我不知道。如果只是使用不同的排序。但他们的数量不是无限的。
  • 再一次,如果我使用谓词,并不是所有条目都输出
  • FRC 需要一个排序描述符(只能对实体的持久属性进行排序),因此 FRC 结果总是非常确定的。

标签: ios core-data nspredicate nsfetchedresultscontroller nssortdescriptor


【解决方案1】:

子类NSSortDescriptor 更改默认排序行为。像这样的东西应该可以工作:

@interface RandomSortDescriptor : NSSortDescriptor 
@end

@implementation RandomSortDescriptor

- (id)copyWithZone:(NSZone*)zone
{
    return [[[self class] alloc] initWithKey:[self key] 
                           ascending:[self ascending] selector:[self selector]];
}

- (id)reversedSortDescriptor
{
    return [[[self class] alloc] initWithKey:[self key] 
                           ascending:![self ascending] selector:[self selector]];
}

- (NSComparisonResult)compareObject:(id)object1 toObject:(id)object2 
{
    NSUInteger random = arc4random_uniform(3);
    switch (random)
    {
       case 0:
          return NSOrderedSame
       case 1:
          return NSOrderedDescending;
       case 2:
          return NSOrderedDescending;
     }
}

@end

【讨论】:

  • 取决于内部的排序算法,这可能会产生有偏差的结果。见bost.ocks.org/mike/shuffle/compare.html。如果您需要无偏的结果,请将随机值分配给实体上的排序属性并按此排序。
猜你喜欢
  • 2011-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多