0

我有一个从 web 服务获取数据并将其解析为核心数据的应用程序。

标签栏设计

该应用程序基于选项卡栏,第一个选项卡 ,IntroViewController用于设置首选项。用户可以通过 2 个选项过滤商店:

Drive Thru通过点击设置 的DriveThru单元来激活self.driveThru = TRUE

Open Now Cell通过点击which sets来激活Open Nowself.open = TRUE

介绍视图控制器

位置的所有数据都存储在数据库中。底部IntroViewController是一个搜索按钮,可将您带到tableviewcontroller选项卡。这个:

  1. self.stores从核心数据获取中填充数组
  2. 创建具有属性设置为打开或关闭字符串的MyLocation对象estado
  3. 对该数组进行排序MyLocation并将该数组重新设置self.annotationsToSort为已排序的数组
  4. 最后,它使用排序后的版本来填充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];
}

带有位置的 self.stores 数组

这将返回所有商店。所以我在通过数组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. 我应该如何操作数据才能做到这一点?我唯一想到的是:

  1. self.annotationsToSort排序前循环
  2. 创建一个没有对象的新数组estado = closed
  3. 然后排序

有什么建议么?

4

0 回答 0