在一个我有大量托管对象的应用程序上工作,我想针对这些应用程序获取一些随机实例。
我的问题是,有什么方法可以使用NSPredicate和NSFetchRequest随机返回几个对象。
我看到您实际上可以使用数据建模器将NSFetchRequest添加到实体中,以任何方式使用此方法来进行随机获取?
还有什么是确定表“计数”的最佳方法,因此我可以设置随机数生成器的范围。
让我知道您是否需要更多详细信息。
谢谢!
缺口
最佳答案
这可能并不完全是您实现的方式,但是希望它可以帮助您入门。
header 中或实现文件顶部的某个位置:
#import <stdlib.h>
#import <time.h>
在您实现的其他地方:
//
// get count of entities
//
NSFetchRequest *myRequest = [[NSFetchRequest alloc] init];
[myRequest setEntity: [NSEntityDescription entityForName:myEntityName inManagedObjectContext:myManagedObjectContext]];
NSError *error = nil;
NSUInteger myEntityCount = [myManagedObjectContext countForFetchRequest:myRequest error:&error];
[myRequest release];
//
// add another fetch request that fetches all entities for myEntityName -- you fill in the details
// if you don't trigger faults or access properties this should not be too expensive
//
NSArray *myEntities = [...];
//
// sample with replacement, i.e. you may get duplicates
//
srandom(time(NULL)); // seed random number generator, so that you get a reasonably different series of random integers on each execution
NSUInteger numberOfRandomSamples = ...;
NSMutableSet *sampledEntities = [NSMutableSet setWithCapacity:numberOfRandomSamples];
for (NSInteger sampleIndex = 0; sampleIndex < numberOfRandomSamples; sampleIndex++) {
int randomEntityIndex = random() % myEntityCount; // generates random integer between 0 and myEntityCount-1
[sampledEntities addObject:[myEntities objectAtIndex:randomEntityIndex]];
}
// do stuff with sampledEntities set
如果需要采样而不替换,以消除重复,则可以创建
NSSet
randomEntityIndex
对象的NSNumber
,而不是仅采样随机int
。在这种情况下,请从有序的
NSSet
中采样,从袋中取出NSNumber
对象,然后减少myEntityCount
以便从集合中选择一个随机的NSNumber
对象。关于iPhone操作系统: Fetching a random entity instance using NSPredicate Nsfetchrequest and core data,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2830533/