存储许多NSDictionaries的最佳方法是什么?

时间:2012-07-20 17:33:31

标签: iphone objective-c nsstring nsarray nsdictionary

我需要为iPhone应用程序中的不同配置和设置存储许多 Facebook App Id Twitter Consumer Keys

我知道我这样做的方式并不是最好的,因为它有太多的if else语句。使用正确的 Objective-C设计模式来完成此任务的最佳方法是什么?

这是我的代码:

- (id) init {
self = [super init];
if (!self) return nil;

keyNames = [[NSArray arrayWithObjects:
             @"facebookAppId", 
             @"facebookLocalAppId",
             @"twitterConsumerKey",
             @"twitterSecret",
             nil]retain];

if (MainLanguage == @"English") {

    keys = [[NSArray arrayWithObjects:
             @"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", //facebookAppId
             @"yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy", //facebookLocalAppId
             @"zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz", //twitterConsumerKey
             @"wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww", //twitterSecret
             nil]retain];

    dictionary = [[NSDictionary dictionaryWithObjects:keys forKeys:keyNames]retain];

}

else if (MainLanguage == @"Spanish") {

    keys = [[NSArray arrayWithObjects:
             @"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", //facebookAppId
             @"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", //facebookLocalAppId
             @"cccccccccccccccccccccccccccccccc", //twitterConsumerKey
             @"dddddddddddddddddddddddddddddddd", //twitterSecret
             nil]retain];

    dictionary = [[NSDictionary dictionaryWithObjects:keys forKeys:keyNames]retain];

}  else if (MainLanguage == @"French") {

   //etc...

} else if (MainLanguage == @"Italian") {

    //etc...

}


//etc..

return self;

}

-(void)dealloc {

    [keyNames release];
    [keys release];
    [dictionary release];
    [super dealloc];

}

2 个答案:

答案 0 :(得分:1)

两个主要问题:

  • 为什么数组中的键名?
  • 您不应该将NSString *与==。
  • 进行比较

您可能也想使用语言代码。

我能想到两个" Objective-C"选项,一个hacky选项,一个" C"选项:

  1. 将其存储在字典中。这看起来有点浪费,因为它构造了一堆词典,只使用其中一个。

    [NSDictionary dictionaryWithObjectsAndKeys:
      [NSDictionary dictionaryWithObjectsAndKeys:
        @"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", @"facebookAppId",
        @"yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy", @"facebookLocalAppId",
        ...
      nil], @"en",
      [NSDictionary dictionaryWithObjectsAndKeys:
        @"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", @"facebookAppId",
        ...
      nil], @"es",
      ...
    nil]
    
  2. 将它放在一个字典中。这可能有问题,因为所有人必须做的就是解压缩你的.ipa。

    <dict>
      <key>en</key>
      <dict>
        <key>facebookAppId</key>
        <string>...</string>
        ...
      </dict>
      <key>es</key>
      <dict>
        ...
      </dict>
      ...
    </dict>
    
  3. 将其存储在Localizable.strings中。再次,通过拉开.ipa。

  4. 解压缩
  5. 将其存储在结构数组中:

    struct {
      NSString *lang;
      NSString *facebookAppId;
      NSString *facebookLocalAppId;
      NSString *twitterConsumerKey;
      NSString *twitterConsumerSecret;
    } const foo_data[] = {
      {@"en", @"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", @"yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy", ...},
      {@"es", @"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", ...},
      ...
    };
    
    ...
    
    for (size_t i = 0; i < sizeof(foo_data)/sizeof(foo_data[0]); i++) {
      if ([lang isEqualToString:foo_data[i].lang]) {
        return [NSDictionary dictionaryWithObjectsAndKeys:
                 foo_data[i].facebookAppId,@"facebookAppId",
                 ...
               nil];
      }
    }
    

答案 1 :(得分:0)

那么数据必须存储在某个地方吗?您可以拥有一个单独的类,将数据存储在哈希表中。然后你只需要在每次获得语言时都能引用它。你的代码肯定看起来更干净。查看NSHashTable。