CoreData извлекает данные предварительной выборки - PullRequest
0 голосов
/ 06 мая 2018

У меня есть каталог устройств, который содержит 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) {

    }];

}

enter image description here

...