ios - 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) {
}];
}
解决方案
推荐阅读
- excel - Excel 匹配,索引函数与非函数
- amazon-ec2 - 安装 ECM ECS 社区版 - 任务任务失败 [common_baseline_install : Common | 格式化 ECS 分区]
- mysql - 如何编辑 MySQL 8 排序规则?
- php - 如何将一对多数据从数据库传输到 Laravel 中的模板?
- python - 概率支持向量机,如何在“热图”内绘制点?
- grails - Grails:Spring Security Core Shiro插件不记得资源用户试图访问
- syntax - 如何将列表传递给 BASIC-256 中的子例程
- algorithm - 我从解决方案中得到不同的快速排序结果
- c++ - 如何捕获除使用 GDB 的异常类型之外的所有异常类型?
- amazon-web-services - 如何通过 Lambda 函数重命名 S3 存储桶中的文件