亲爱的互联网长老,
我正在尝试处理一系列字典,不同的数据集需要不同的处理,每个数据集都需要处理创建,更新和删除操作。很简单,我正在寻找一种更有效/更聪明的方法......
- (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"]) {
}
}
}
答案 0 :(得分: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
}
如果需要,也可以通过在selector-caller方法(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]];
然后,您将为selectored方法提供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
}
}
希望能给你一些想法。