我有一个带有显示项目列表的 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/