首页 > 解决方案 > CoreData 获取预取数据

问题描述

我有一个包含 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) {

    }];

}

在此处输入图像描述

标签: iosobjective-cxcodecore-datansfetchrequest

解决方案


推荐阅读