2012-07-20 94 views
0

我需要存储很多Facebook应用程序Id的Twitter消费者密钥为我的iPhone应用程序中的不同配置和设置。什么是存储许多NSDictionaries的最佳方式?

我知道我做这件事的方式不是最好的,因为它有太多的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]; 

} 
+0

你居然不这样做不对,假设你有每种语言不同的值。如果你想知道如何存储数据,我可以发布一个关于创建自定义可存档对象的例子。 – Dustin 2012-07-20 17:53:35

回答

1

两个主要问题:

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

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

我能想到的两个 “的Objective-C” 选项,一个哈克选项,一个 “C” 选项:

  1. 储存于一本字典。这看起来有点浪费,因为它构造了一堆字典并且只使用其中的一个。

    [NSDictionary dictionaryWithObjectsAndKeys: 
        [NSDictionary dictionaryWithObjectsAndKeys: 
        @"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", @"facebookAppId", 
        @"yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy", @"facebookLocalAppId", 
        ... 
        nil], @"en", 
        [NSDictionary dictionaryWithObjectsAndKeys: 
        @"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", @"facebookAppId", 
        ... 
        nil], @"es", 
        ... 
    nil] 
    
  2. 把它贴在一个plist字典中。这可能是有问题的,因为所有需要做的事情是解压缩你的.ipa。

    <dict> 
        <key>en</key> 
        <dict> 
        <key>facebookAppId</key> 
        <string>...</string> 
        ... 
        </dict> 
        <key>es</key> 
        <dict> 
        ... 
        </dict> 
        ... 
    </dict> 
    
  3. 将其存储在Localizable.strings中。再一次,通过解压缩.ipa来解压缩。

  4. 储存于结构的数组:

    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]; 
        } 
    } 
    
+0

结构选项非常棒!非常感谢! – Winston 2012-07-23 14:26:18

0

那么数据已被存储的地方吧?你可以有一个单独的类将数据存储在散列表中。然后你只需要在每次获得一种语言时都参考它。你的代码一定会看起来更干净。查看NSHashTable。

+0

谢谢,我会看看。我想过一个plist文件,但在这种情况下它并不安全。 NSHashTable适用于iPhone吗? – Winston 2012-07-20 17:45:51

相关问题