objective-c - 为核心数据获取提供随机排序

标签 objective-c core-data interface-builder nsfetchrequest

我有一个带有显示项目列表的 ScrollView 的 Mac 应用程序。项目的数据由 Core Data 提供。我需要提供一个“随机播放”按钮,用于随机化 ScrollView 中项目的顺序。

最佳答案

如果您使用绑定(bind),您只有两个选择:(1),绑定(bind)到一个自定义对象,该对象具有返回排序数组的键,或者 (2) 使用随机化而不是排序的排序描述符。

在某些情况下,第二种选择更容易。要生成随机排序描述符,您可以 (1) 创建 NSSortDescriptor 子类并覆盖 compareObject:toObject:

- (NSComparisonResult)compareObject:(id)object1 toObject:(id)object2{
  NSUInteger ran=(arc4random() % 3);
  switch (ran) {
    case 0:
      return NSOrderedSame;
      break;
    case 1:
      return NSOrderedDescending;
    default:
      return NSOrderedAscending;
      break;
  }  
}

或 (2) 提供一个选择器或 block 以相同的方式提供随机排序:

  NSSortDescriptor *rs=[NSSortDescriptor sortDescriptorWithKey:@"intValue" 
                                                    ascending:YES
                                                   comparator:^(id obj1, id obj2){
                                                     NSUInteger ran=(arc4random() % 3);
                                                     switch (ran) {
                                                       case 0:
                                                         return NSOrderedSame;
                                                         break;
                                                       case 1:
                                                         return NSOrderedDescending;
                                                       default:
                                                         return NSOrderedAscending;
                                                         break;
                                                     }
                                                   }];

(2) 的缺点是您必须提供被排序的对象理解的键,例如在上面,我对 NSNumber 对象数组进行了排序,因此我必须提供一个 NSNumber 响应的键 intValue。子类方法并不真正关心键。

但是,使用排序只会返回一个弱随机化的数组,因为随机化只是一种困惑的排序,即大多数元素不会在数组中移动很远。要创建更随机的效果,请将随机排序堆叠到一个数组中,以便它们多次遍历该数组,例如:

[ aMutableArray sortUsingDescriptors:[NSArray arrayWithObjects:rs,rs,rs, nil]];

如果您使用绑定(bind),只需在您使用普通排序描述符的地方使用随机化排序描述符,您应该得到有用的随机化的东西。

关于objective-c - 为核心数据获取提供随机排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5493215/

相关文章:

ios - 一次隐藏多个 UILabel

xcode - 从 Nib 中启动 Storyboard?

iphone - 使用 UIScrollView

ios - 滑动以删除 uitableview 单元格

ios - fetchBachSize 是真的有必要还是有缺陷被替代呢?

ios - 是否使用 Core Data?

ios - 从 Storyboard启动到 UINavigationController 中除 root 之外的级别

objective-c - 如何使用 UIKit 计算文本的确切高度?

Objective-C 简单的 hello world 无法编译

objective-c - 在 iPhone/iPad 上存储数据