back

NSUserDefaults/NSCodingによる設定情報の保存 (7/8)

■NSDictionaryに保存したSampleDataを保存するには?

これでSampleDataの設定ファイル保存はできるようになりました。そこで、応用としてワンランク上を目指してみましょう。それは、「SampleDataを保存したNSDictionaryを保存する」ということです。

一応、SampleDataNSUserDefaultsで保存できるようにはなりましたが、SampleDataを保管したNSDictionaryをそのままsetObject: forKey:で保存しようとすると、やっぱりエラーになります。NSDictionaryに保管されているSampleDataをそれぞれエンコードして保存したりするための機能はもっていないからです。

では、どうするか? やっぱり、そのためのメソッドをNSUserDefaultsに追加してやるのがよさそうですね。というわけで、下のリスト欄のようなコードを書いてみました。

ここでは、setSampleDataDic: forKey:と、sampleDataDicForKey:の2つのメソッドを更に追加してあります。どうやってNSDictionaryを保存するかですが、ここでは「キーをまとめてNSArrayとして保存し、中のSampleDataは1つ1つNSDataに変換して保存する」という形にしてみました。この方法だと、万が一、NSArrayのキーと同じ名前のキーでSampleDataが保存されたりすると上書きされてデータが破損する可能性がありますので、あんまりおすすめできるやり方ではありませんが、まぁわかりやすい方法だろうといことで……。

メソッドの内容はさほど難しいわけではないので、それぞれでコードを読んでみてください。これでSampleDataをそのまま保存するだけでなく、名前をつけてNSDictionaryに保管したものを保存できるようになりました!



(by. SYODA-Tuyano.)

※リストが表示されない場合

AddBlockなどの広告ブロックツールがONになっているとリストなどが表示されない場合があります。これらのツールをOFFにしてみてください。

※NSUserDefaultsの拡張(SampleData.h)
@interface NSUserDefaults(SampleDataSupport)
-(void)setSampleData:(SampleData*)obj forKey:(NSString*)aKey;
-(SampleData*)sampleDataForKey:(NSString*)aKey;
-(void)setSampleDataDic:(NSDictionary*)obj forKey:(NSString*)aKey;
-(NSMutableDictionary*)sampleDataDicForKey:(NSString*)aKey;
@end


※NSUserDefaultsの拡張(SampleData.m)

@implementation NSUserDefaults(SampleDataSupport)

-(void)setSampleData:(SampleData*)obj forKey:(NSString*)aKey { 略 }

-(SampleData*)sampleDataForKey:(NSString*)aKey { 略 }

-(void)setSampleDataDic:(NSDictionary*)obj forKey:(NSString*)aKey {
    NSArray* keyarr = [obj allKeys];
    [self setObject:keyarr forKey:aKey];
    for (int i = 0; i < [keyarr count]; i++) {
        SampleData* val = [obj objectForKey:[keyarr objectAtIndex:i]];
        [self setSampleData:val forKey:[keyarr objectAtIndex:i]];
    }
}

-(NSMutableDictionary*)sampleDataDicForKey:(NSString*)aKey {
    NSMutableDictionary* dic = [NSMutableDictionary dictionary];
    NSArray* keyarr = [self arrayForKey:aKey];
    for (int i = 0;i < [keyarr count]; i++){
        SampleData* val = [self sampleDataForKey:[keyarr objectAtIndex:i]];
        [dic setObject:val forKey:[keyarr objectAtIndex:i]];
    }
    return dic;
}

@end



   

記事のリストに戻る



PC Site G+ mail