1

コマンド リストには何百ものコマンドが含まれており、このコマンド リストは頻繁に呼び出す必要があります。お気に入り:

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」は良い方法ではないと思います...

より高速で効率的なアルゴリズムはどれですか?

4

1 に答える 1

4

NSDictionaryセレクター、呼び出し、またはブロックなど、コマンド名をコードに直接マップする を使用できます。何かのようなもの:

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 (?) から、省略形のリテラル構文を使用してアクション ディクショナリを作成することもできるようになりました。

NSDictionary *actions = @{
    @"command1" : ^{
        …
    },
    @"command2" : ^{
        …
    },
};

2 番目のコマンド ブロックの後の末尾のコンマも機能することに注意してください。

于 2012-07-19T08:20:21.810 に答える