У меня есть каталог устройств, который содержит SkuDetails. Мне нужно реализовать фильтр на основе цветов, цены и хранения.
для получения всех устройств, я создал эту функцию:
[[CoreDataManager sharedInstance] fetchWithEntity:@"DevicesCatalogue" Predicate:nil success:^(NSArray *fetchLists) {
if(fetchLists) {
NSMutableArray *filteredItems = [NSMutableArray new];
NSSortDescriptor *valueDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
filteredItems = (NSMutableArray *)[fetchLists sortedArrayUsingDescriptors:[NSArray arrayWithObject:valueDescriptor]];
DeviceDetails *deviceDetails = [[DeviceDetails alloc]init];
NSLog(@"first filter item ");
deviceDetails.devices = filteredItems;
successBlock(deviceDetails);
}
else {
failureBlock(nil);
}
}failed:^(NSError *error) {
failureBlock(error);
}];
для получения всех цветов, которые я создал:
+ (void)getAllColorsWithSuccess:(void (^)(NSArray *colorsList))successBlock
failureBlock:(void (^)(NSError * error))failureBlock {
[[CoreDataManager sharedInstance] fetchWithEntity:@"DevicesCatalogueSkuDetails" Predicate:nil success:^(NSArray *fetchLists) {
if(fetchLists) {
NSArray *colorsList = [@[fetchLists,fetchLists] valueForKeyPath:@"@distinctUnionOfArrays.colorCode"];
NSLog(@"%@",colorsList);
successBlock(colorsList);
}
else {
failureBlock(nil);
}
}failed:^(NSError *error) {
failureBlock(error);
}];
}
наоборот я добавил функции для хранения и цены.
Для функциональности фильтрации мне нужно знать, как я могу предварительно выбрать данные, которые уже получены с использованием предиката.
Например, для получения устройств в диапазоне цен я создал эту функцию, которая возвращает только те устройства, которые состоят из цен:
NSPredicate * pricePredicate = [NSPredicate predicateWithFormat:@"ANY skuDetails.priceWithVat >= %f AND ANY skuDetails.priceWithVat <= %f",selectedSliderMinValue,selectedSliderMaxValue];
[[CoreDataManager sharedInstance] fetchWithEntity:@"DevicesCatalogue" Predicate:pricePredicate success:^(NSArray *fetchLists) {
if(fetchLists) {
for (Devices *devices in fetchLists) {
NSLog(@"name --- %@",devices.name);
}
[self resetAllArrays];
}
}failed:^(NSError *error) {
}];
Мой вопрос заключается в том, что теперь я получаю массив устройств, как я могу предварительно выбрать эти устройства, чтобы включить больше фильтров, таких как память и цвета? Можно ли повторно получить CoreData, который уже извлекается с одним предикатом.
**
- ОБНОВЛЕНИЕ:
**
для фильтра я поставил эту функцию, но это в основном изменяет параметры и вызывает снова, но как я могу вызвать его, основываясь на моих данных выборки, основанных на ценах, которые содержат только 2 устройства.
-(void)getAllDevicesDetailBasedOnFilter{
NSMutableArray *predicateArray = [NSMutableArray array];
//DevicesCatalogueSkuDetails
isColorSelected = YES;
isBrandSelected = YES;
isStorageSelected = YES;
isPriceSelected = YES;
if (isPriceSelected) {
NSPredicate * pricePredicate = [NSPredicate predicateWithFormat:@"ANY skuDetails.priceWithVat >= %.f AND ANY skuDetails.priceWithVat <= %.f",minimumPriceValue,maximumPriceValue];
[predicateArray addObject:pricePredicate];
}
if (isBrandSelected) {
NSPredicate * brandPredicate = [NSPredicate predicateWithFormat:@"brand = %@", @"Samsung"];
[predicateArray addObject:brandPredicate];
}
if (isColorSelected) {
NSPredicate * colorPredicate = [NSPredicate predicateWithFormat:@"ANY skuDetails.color CONTAINS[cd] %@",@"Green"];
[predicateArray addObject:colorPredicate];
}
if (isStorageSelected) {
NSPredicate * colorPredicate = [NSPredicate predicateWithFormat:@"ANY skuDetails.storage CONTAINS[cd] %@",@"256"];
[predicateArray addObject:colorPredicate];
}
NSPredicate *compoundPredicate = [NSCompoundPredicate andPredicateWithSubpredicates:predicateArray];
[[CoreDataManager sharedInstance] fetchWithEntity:@"DevicesCatalogue" Predicate:compoundPredicate success:^(NSArray *fetchLists) {
if(fetchLists) {
}
}failed:^(NSError *error) {
}];
}