Работа над приложением, где у меня есть большое количество управляемых объектов, против которых я хочу выбрать несколько случайных экземпляров.
Мой вопрос, там любой способ, которым я могу использовать NSPredicate и NSFetchRequest для возврата нескольких объектов наугад.
Я видел, что Вы могли на самом деле добавить NSFetchRequest в объект с помощью средства моделирования данных, какой-либо способ сделать случайную выборку с помощью этого?
Также что было бы лучшим методом для определения "количества" таблицы, таким образом, я могу установить границы генератора случайных чисел.
сообщите мне, нужно ли Вам больше деталей.
Спасибо!
Nick
Это может быть не совсем как вы это реализуете, но, надеюсь, с этого вы начнете.
Где-то в вашем заголовке или в верхней части файла реализации:
#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
of randomEntityIndex
NSNumber
объектов, вместо простой выборки случайных int
s.
В данном случае образец из упорядоченного NSSet
, удаляйте объекты NSNumber
по мере их извлечения из пакета и уменьшайте myEntityCount
для целей выбор случайного объекта NSNumber
из набора.