objective-c - 如何有效地将命令名称映射到操作?

标签 objective-c ios

我有一个命令列表,其中包含数百个命令,并且需要经常调用此命令列表。像:

if([command isEqualToString:"openPage1"]){
  open page 1
}else if ([command isEqualToString:"jumpToPage4"]){
  get param1 and param2
  jump to page 4
}else if ([command isEqualToString:"backToPage10"]){
  get param1
  back to page 10
}....

由于有数百个命令并且经常调用,所以我认为“if else”不是一个好方法......

哪种算法更快更高效?

最佳答案

你可以有一个 NSDictionary将命令名称直接映射到代码,无论是选择器、调用还是 block 。就像是:

NSMutableDictionary *actions = [NSMutableDictionary dictionary];
[actions setObject:^{
    [self getParam1];
    [self getParam2];
    [self navigateSomewhere];
} forKey:@"openPage1"];

进而:
dispatch_block_t action = [actions objectForKey:command];
if (action) {
    action();
} else {
    /* handle unknown command */
}

当然,字典只会被初始化一次,然后被缓存。如果操作始终是同一个调用,只是使用不同的参数,您可以将命令名称直接映射到参数:
// setup:
NSDictionary *commandsToPages = [NSDictionary dictionaryWithObjectsAndKeys:
    [NSNumber numberWithInt:1], @"command1",
    /* more mappings */,
    nil];
// …and later:
NSNumber *pageNumber = [commandsToPages objectForKey:commandName];
[self displayPage:[pageNumber intValue]];

如果可能的话,还可以选择仅解析命令名称以提取页码。

PS。从 LLVM 4.1 (?) 开始,您还可以使用速记文字语法来创建 Action 字典,这样看起来会更容易一些:
NSDictionary *actions = @{
    @"command1" : ^{
        …
    },
    @"command2" : ^{
        …
    },
};

请注意,即使第二个命令 block 之后的尾随逗号也有效。

关于objective-c - 如何有效地将命令名称映射到操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11556630/

相关文章:

iphone - IOS Urban Airship 。如何处理通知

ios - 如何调用电话并在之后返回原始应用程序

ios - 我们可以在 ios 中将相同的登录凭据从一个应用程序传递到另一个应用程序吗

objective-c - Objective-C 弧 : How to remove an object from an array/set and then return it as an autoreleased object?

objective-c - 如何将 NSString 转换为可以与 FSCreateDirectoryUnicode 一起使用的内容?

ios - NSCFNumber isEqualToString : crash IOS11 between viewDidLoad and viewWillApear

ios - 在 iOS 5.1.1/6.0 和 Xcode 4.5 上开发无许可证的应用程序

ios - 我怎样才能做出这样的观点

ios - 在后台运行代码

ios - ObjC/iOS - 大写每个单词的首字母而不修改其他字母