大家好,我想使用iOS8的新APN来处理通知操作。在这种方法中:
- (void)application:(UIApplication *)application
handleActionWithIdentifier:(NSString *)identifier
forRemoteNotification:(NSDictionary *)notification
completionHandler:(void (^)())completionHandler {
if ([identifier isEqualToString:@"ACCEPT_IDENTIFIER"]) {
[self handleAcceptActionWithNotification:notification];
}
else if([identifier isEqualToString:@"MAYBE_IDENTIFIER"]) {
[self handleMaybeActionWithNotification:notification];
}
else if ([identifier isEqualToString:@"REJECT_IDENTIFIER"]) {
[self handleRejectActionWithNotification:notification];
}
else if....blah blah blah..
}
在这种情况下,我可能不得不在将来用NSString编写太多if-else语句,并且我知道某种方法可以避免使用过多if-else语句,例如使用switch,但它不适用于字符串或NSString情况下。
是否可以避免在此字符串或NSString案例中编写过多if-else语句? 提前谢谢。
答案 0 :(得分:5)
您可以将所有选择器放在字典映射中
NSDictionary* handleMap = @{
@"ACCEPT_IDENTIFIER" : NSStringFromSelector(@selector(handleAcceptActionWithNotification:))
@"MAYBE_IDENTIFIER" : NSStringFromSelector(@selector(handleMaybeActionWithNotification:))
@"REJECT_IDENTIFIER" : NSStringFromSelector(@selector(handleRejectActionWithNotification:)])
};
NSString* selString = handleMap[identifier];
if (selString) {
SEL sel = NSSelectorFromString(selString);
[self performSelector:sel withObject:notification];
}
handleMap
应声明为成员变量,因此只会初始化一次。
答案 1 :(得分:2)
只要您正确命名处理程序方法,就可以使用这样的方法 -
- (void)application:(UIApplication *)application
handleActionWithIdentifier:(NSString *)identifier
forRemoteNotification:(NSDictionary *)notification
completionHandler:(void (^)())completionHandler {
NSString *selectorStr=[NSString stringWithFormat:@"handle%@:", identifier];
SEL selector=NSSelectorFromString(selectorStr);
if ([self respondsToSelector:selector]) {
[self performSelector:selector withObject:notification];
}
}
然后,您将创建一系列方法,例如
-(void) handleACCEPT_IDENTIFIER:(NSDictionary *)notification {
....
}
-(void) handleMAYBE_IDENTIFIER:(NSDictionary *)notification {
....
}
等等。
注意,此技术将生成编译器警告。因为看到this question的答案的原因 - 如果您的方法返回void
,您可以忽略警告。
答案 2 :(得分:0)
可能看起来很多,但我认为这是一种很好的代码结构
易于阅读,易于维护。
因为它是明确的,关键字搜索和代码浏览总是微不足道的。
调用图生成和静态分析也将更加彻底地完成(有限制)。
有些程序员不喜欢这种模式说“太多” 我不明白这个“太多”点的基础是什么 对谁来说太多了?打字员?键盘硬件?
我总是喜欢简单明了的代码。