2

亲爱的互联网前辈们,

我正在尝试处理一系列字典,不同的数据集需要不同的处理,每个数据集都需要处理Create、Update和Delete操作。很简单,我正在寻找一种更有效/更聪明的方法......

- (NSDictionary*)processUpdatesForDataSet:(NSString*)dataSet ofType:(NSString*)type {


if ([dataSet isEqualToString:@"countries"]) {

    if ([type isEqualToString:@"CREATE"]) {


    } else if ([type isEqualToString:@"UPDATE"]) {


    } else if ([type isEqualToString:@"DELETE"]) {


    }

} else if ([dataSet isEqualToString:@"connections"]) {

    if ([type isEqualToString:@"CREATE"]) {


    } else if ([type isEqualToString:@"UPDATE"]) {


    } else if ([type isEqualToString:@"DELETE"]) {


    }

} else if ([dataSet isEqualToString:@"sites"]) {

    if ([type isEqualToString:@"CREATE"]) {


    } else if ([type isEqualToString:@"UPDATE"]) {


    } else if ([type isEqualToString:@"DELETE"]) {


    }

}

}
4

1 回答 1

3

这是一个相当特殊的情况,我相信有些人会认为这种方法有点疯狂,但是你有它。

两种选择。一种是设置块来处理数据集。缺点是你必须将这些块保存在一些字典或类似的字典中。我不打算使用那种方法。另一种方法是根据数据集生成选择器,然后检查并调用该方法。

在 processUpdates 方法中,您将拥有

NSString *dataSelString = [NSString stringWithFormat:@"dataSet_%@:", dataSet];
SEL dataSel = NSStringFromSelector(dataSelString);
if ([self respondsToSelector:dataSel)] {
    [self performSelector:dataSel withObject:type];
} else {
    NSLog(@"warning: unknown dataSet: %@", dataSet);
    // deal with unknown data set, e.g. alerting user or such
}

对于每种数据集类型,您将拥有一个方法self,例如

- (void)dataSet_countries:(NSString *)type
{
    // handle each type accordingly
}

如果需要,您也可以通过在选择器调用方法 (processUpdates) 中检查类型一次,将 if else 简化为 switch case。例子:

在顶部的 .m 文件中

typedef enum {
    DataTypeInsert  = 0,
    DataTypeUpdate  = 1,
    DataTypeDelete  = 2,
    DataTypeUnknown = NSNotFound
} DataType;
static NSArray *typeValues = nil;

// in processUpdates method
if (typeValues == nil) {
    // we set up typeValues once
    typeValues = [[NSArray alloc] initWithObjects:@"INSERT", @"UPDATE", @"DELETE", nil];
}
// since 'unknown' is NSNotFound, this will work out fine always
NSNumber *typeVal = [NSNumber numberWithInt:[typeValues indexOfObject:type]];

然后,您将为选择的方法提供 typeVal 而不是 type ,并且该方法本身将执行例如

- (void)dataSet_countries:(NSNumber *)type
{
    DataType dataType = [type intValue];
    switch (dataType) {
    case DataTypeInsert:
        break;
    // ...
    case DataTypeUnknown:
        // alert user or such that the type was invalid
    }
}

希望能给你一些想法。

于 2012-08-22T13:51:12.450 回答