2012-03-22 54 views
0

我沒有使用設置包來存儲我的應用程序的設置,因爲我更喜歡允許用戶訪問應用程序中的設置(它們可能會經常更改) 。我意識到有兩種選擇,但現在,我試圖找到最適合在應用程序中存儲設置的地方。爲iPhone應用程序存儲設置的最有效的替代方法

我有很多設置(從我讀過的,可能對於NSUserDefaults來說太多了),我正在考慮的兩個主要選項是: 1)將設置存儲在plist的字典中,設置到應用程序委託中的NSDictionary屬性中,並通過sharedDelegate訪問它們2)將設置存儲在Core Data實體中(設置實體上的1行),將設置加載到應用程序委託中的Settings對象中,並通過sharedDelegate

這兩個,這將是最佳的方法,性能明智嗎?

+0

'NSDefaults'太多了嗎?如果你有一千把鑰匙,那麼很可能是的。但是,你做錯了你的設置。 – Costique 2012-03-22 04:22:34

+1

如果你不想使用大量設置的NSUserDefaults,爲什麼不創建一個包含所有設置的對象,使它符合NSCoding協議,將它保存在應用程序終止/ resigns激活並將其加載到應用程序didFinishLaunching上? – bennythemink 2012-03-22 04:51:25

+1

如果你存儲了大量的數據,忘記關於所有「使用'[ud synchronize]'!! 1111one」 - 你在stackoverflow上看到的數據。無論如何他們通常都是錯的。不要在每個'setObject:forKey:'之後調用同步,並且你不會有任何問題。 – 2012-03-22 05:53:18

回答

3

只需使用NSUserDefaults,就是它的用途。爲什麼你覺得你有太多的東西?另外,如果您以後決定使用設置包,則無論如何您都需要使用NSUserDefaults。

+0

與以上兩種選擇相比,它是否真的有更好的性能?有沒有任何一種情況(或多種情況),其中上述兩種情況哪一種更好?我一直在相當廣泛地閱讀這些主板,並且我認爲我從Marcus Zarra看到了一些內容,有時將設置存儲在Core Data中是更優化的,但我不知道它在哪個線程中(而且我不認爲他解釋*時,它是更優化) – SAHM 2012-03-22 04:25:36

+2

我真的沒有看到任何情況下,你會訪問默認值足夠的任何性能增益明顯。另外,NSUserDefaults實際上只是一個plist,你最終會實現已經存在的東西。 – sosborn 2012-03-22 05:26:04

1

你應該只使用NSUserDefaults。如果您認爲有很多NSUserDefaults,建議您創建1個模型類並使用它。創建一個模型類並將您的設置作爲屬性並創建該類的對象並將其保存到NSUserDefaults對您來說很容易,因爲它只是一次性實現。

@interface SettingsModelClass : NSObject 
{ 
    NSString *strSetting1; 
    BOOL boolSetting2; 
} 

@property (nonatomic,retain) NSString *strSetting1; 
@property (nonatomic,assign) BOOL boolSetting2; 

// Implementaiton

@implementation SettingsModelClass 

@synthesize strSetting1, boolSetting2; 

-(void)dealloc 
{ 
    [strSetting1 release]; 
    [super dealloc]; 
} 

- (void)encodeWithCoder:(NSCoder *)encoder 
{ 
    //Encode properties, other class variables, etc 
    [encoder encodeObject:self.strSetting1 forKey:@"StringSetting"];  
    [encoder encodeBool:self.boolSetting2 forKey:@"BoolSetting"]; 
} 

- (id)initWithCoder:(NSCoder *)decoder 
{ 
    self = [super init]; 
    if(self != nil) 
    { 
     //decode properties, other class vars 
     self.strSetting1 = [decoder decodeObjectForKey:@"StringSetting"]; 
     self.boolSetting2 = [decoder decodeBoolForKey:@"BoolSetting"]; 
    } 
    return self; 
} 

@end 

請留下,如果您有任何疑問,意見。我很樂意幫助你。

更新 是的,你可以通過應用程序委託來訪問。或者甚至可以將它創建爲單例類實例。 這種方法使用OOPS基金會,所以它是連擊我遵循這種模式,我相信。

+0

這看起來不錯 - 在什麼點(即有多少設置)這個方法比使用直接NSUserDefaults變得更有優勢? – SAHM 2012-03-22 05:19:57

+0

另外,我是否會將設置加載到應用程序委託中的SettingsModelClass對象中,並通過應用程序中的sharedDelegate訪問它們?如果不是,我將如何在整個應用程序中加載/訪問各種視圖控制器中的設置? – SAHM 2012-03-22 05:22:15

+0

請參閱我的更新回答 – 2012-03-22 05:26:15

相關問題