2012-07-19 72 views
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 
}.... 

由於有數百個命令,並且頻繁調用,所以我不認爲「如果別人」是一個好辦法...

哪種算法速度更快,效率?

+0

是否所有這些命令都採用相同數量的參數並具有相同的返回值?如果是這樣,你可以使用字典查找。 – borrrden 2012-07-19 08:19:55

回答

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" : ^{ 
     … 
    }, 
}; 

注意,即使後面的逗號第二個命令塊的工作後, 。

+0

只有當所有的方法都沒有參數並且沒有返回類型的時候,這個方法才能正常工作。但是,這是一個很好的方法,也是我使用的方法。 – borrrden 2012-07-19 08:22:16

+0

這是我在我的評論中開始寫的內容,但現在沒有必要完成它,但速度更快。 :) – holex 2012-07-19 08:24:51

+0

感謝您的快速回復,我更新我的問題,案件有點複雜,命令不只是打開頁面和命令後判斷,一些命令有參數,有些不... – 2012-07-19 08:31:02

相關問題