我有一个从 web 服务获取数据并将其解析为核心数据的应用程序。
该应用程序基于选项卡栏,第一个选项卡 ,IntroViewController
用于设置首选项。用户可以通过 2 个选项过滤商店:
Drive Thru通过点击设置 的DriveThru
单元来激活self.driveThru = TRUE
。
Open Now Cell
通过点击which sets来激活Open Nowself.open = TRUE
。
位置的所有数据都存储在数据库中。底部IntroViewController
是一个搜索按钮,可将您带到tableviewcontroller
选项卡。这个:
self.stores
从核心数据获取中填充数组- 创建具有属性设置为打开或关闭字符串的
MyLocation
对象estado
- 对该数组进行排序
MyLocation
并将该数组重新设置self.annotationsToSort
为已排序的数组 - 最后,它使用排序后的版本来填充
tableview
如果用户检查了introviewcontroller 中的drivethru 选项,那么它应该只显示带有drivethru 的tableview 选项卡。这工作正常。
现在,如果他检查了 introviewcontroller 中的 Open Now 选项,那么它应该只显示打开的商店。
这是我当前从数据库中获取的 tableviewcontroller 方法:
- (void)loadRecordsFromCoreData {
[self.managedObjectContext performBlockAndWait:^{
[self.managedObjectContext reset];
NSError *error = nil;
NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:self.entityName];
[request setSortDescriptors:[NSArray arrayWithObject:
[NSSortDescriptor sortDescriptorWithKey:@"nombrePublico" ascending:YES]]];
//Add Predicate
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(driveThru == %@)", [NSNumber numberWithBool:self.driveThru]];
[request setPredicate:predicate];
self.stores = [self.managedObjectContext executeFetchRequest:request error:&error];
}];
[self populateLocationsToSort];
}
这将返回所有商店。所以我在通过数组populateLocationsToSort
循环时在方法中这样做了:self.stores
for (Location * locationObject in self.stores) {
// 3. Unload objects values into locals
NSString * storeDescription = locationObject.nombrePublico;
NSString * address = locationObject.direccion;
NSString * hor_LV = locationObject.hor_LV;
NSString * hrs24 = locationObject.hrs24;
NSString * driveThru = locationObject.driveThru;
...
NSString * estado;
// Set it based on TimeComparator
if ([TimeComparator dealWithTimeStrings2:locationObject.hor_LV]) {
estado = @"Open";
} else {
estado = @"Closed";
}
// 4. Create MyLocation object based on locals gotten from Custom Object
CLLocationCoordinate2D coordinate;
coordinate.latitude = latitude.doubleValue;
coordinate.longitude = longitude.doubleValue;
MyLocation *annotation = [[MyLocation alloc] initWithName:storeDescription address:address coordinate:coordinate distance:0 hrs24:hrs24 driveThru:driveThru hor_LV:hor_LV estado:estado];
// 5. Calculate distance between locations & uL
CLLocation *pinLocation = [[CLLocation alloc] initWithLatitude:annotation.coordinate.latitude longitude:annotation.coordinate.longitude];
CLLocationDistance calculatedDistance = [pinLocation distanceFromLocation:self.userLocation];
annotation.distance = calculatedDistance/1000;
//Add annotation to local NSMArray
[self.annotationsToSort addObject:annotation];
}
[self sort];
...
所以现在我的self.annotationsToSort
数组包含来自数据库的我的 Location 对象。这些对象现在包含estado
基于当前时间打开或关闭的字段。
但现在到了我只需要在tableviewcontroller
. 我应该如何操作数据才能做到这一点?我唯一想到的是:
self.annotationsToSort
排序前循环- 创建一个没有对象的新数组
estado = closed
- 然后排序
有什么建议么?