嗨,伙计们,我想使用iOS8的新APNs apis来处理通知操作。在这种方法中:
- (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 语句?提前谢谢。
您可以将所有选择器放在字典映射中
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
应该声明为成员变量,因此它只会初始化一次。
只要正确命名处理程序方法,就可以使用如下方法-
- (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 {
....
}
等等
注意,此技术将生成编译器警告。为什么要看到这个问题的答案?在方法返回<code>void</code>的情况下,您可以忽略警告。
它可能看起来很多,但我认为它是一种很好的代码结构
易于阅读,易于维护
因为它是显式的,所以关键字搜索和代码浏览总是微不足道的。此外,调用方图生成和静态分析将更加彻底(有限制)。
一些程序员不喜欢这种模式,说“太多了”
我不明白“太多”这一点的依据
对谁来说太多了?打字爱好者?键盘硬件?
我总是喜欢简单、明确的代码。