iPhone OS:使用NSPredicate Nsfetchrequest和核心数据获取随机实体实例

nic*_*ude 11 iphone core-data nspredicate nsfetchrequest

在一个应用程序上工作,我有一大堆托管对象,我想要获取一些随机实例.

我的问题是,有什么方法可以使用NSPredicate和NSFetchRequest随机返回几个对象.

我看到你实际上可以使用数据建模器将NSFetchRequest添加到实体中,任何使用此方法进行随机获取的方法?

还有什么是确定表"计数"的最佳方法,这样我就可以设置随机数生成器的界限.

如果您需要更多详细信息,请告诉我们.

谢谢!

缺口

Cor*_*oyd 20

而是将fetchLimit与fetchOffset结合使用,这样您就可以有效地仅将单个实体提取到内存中:

NSFetchRequest *myRequest = [[NSFetchRequest alloc] init];
[myRequest setEntity: [NSEntityDescription entityForName:myEntityName inManagedObjectContext:myManagedObjectContext]];
NSError *error = nil;
NSUInteger myEntityCount = [myManagedObjectContext countForFetchRequest:myRequest error:&error];    

NSUInteger offset = myEntityCount - (arc4random() % myEntityCount);
[myRequest setFetchOffset:offset];
[myRequest setFetchLimit:1];

NSArray* objects = [myManagedObjectContext executeFetchRequest:myRequest error:&error];    
id randomObject = [objects objectAtIndex:0];
Run Code Online (Sandbox Code Playgroud)

  • 我尝试了这种获取随机对象的方法,因为我认为它比不断重新获取超过5k条目的整个列表以拉出一个随机对象的开销要少得多.然而,我发现无论偏移是什么,我总会收到相同的十个管理对象中的一个.这种生成随机对象的方法决不是"随机的",因此,对我来说,这是不可接受的.遵循接受的答案的开销很小,至少比我想象的要少得多.因此,我建议接受这个答案. (3认同)

Ale*_*lds 5

这可能与您实现这一点的方式不同,但希望它能帮助您入门.

在标题中或实现文件顶部的某处:

#import <stdlib.h>
#import <time.h>
Run Code Online (Sandbox Code Playgroud)

在您的实施的其他地方:

//
// 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
Run Code Online (Sandbox Code Playgroud)

如果你需要,无需更换来样,来消除重复,您可以创建一个NSSetrandomEntityIndex NSNumber对象,而不是只随机抽样int秒.

在这种情况下,当您将对象从包中NSSet取出时,从有序的,删除NSNumber对象中取样,并myEntityCount为了NSNumber从集合中拾取随机对象而递减.

  • Core Data返回的对象除了`-objectID`属性外都是空的,因此响应非常快.只有您正在访问属性的对象才能完全实现并被拉入内存. (3认同)