2012-04-19 9 views
4

私はいくつかの場所をplistファイルに保存して、後で使うために苦労しています。 ちょっとした検索の後、CLLocationの配列そのものを保存できないことがわかりましたので、 それを行う方法。CLLocationをplistに保存する

1つのCLLocationオブジェクトをNSDictionaryに「シリアライズ」/「デセル化」してから、それらのNSDictionariesの配列をplistファイルに格納することを考えていましたが、より良いものがあるかどうか疑問に思っていました/スマートで信頼性の高い方法で実現します。

ありがとうございます。

EDIT:

これは私がplistの中のデータを保存するために使用する機能です(c_propertyNameは答えからコードを取る)

- (void) addLocation { 
     NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
     NSString *documentsDirectory = [paths objectAtIndex:0]; 
     NSString *path = [documentsDirectory stringByAppendingPathComponent:@"/Locations.plist"]; 

     NSArray *keys = [curLocation c_propertyNames]; 
     NSDictionary *dict = [curLocation dictionaryWithValuesForKeys:keys]; 

     [dict writeToFile: path atomically:YES]; 
    } 

EDIT 2 - SOLUTIONS:

[OK]を、私はすべてを考え出した。私は自分の質問に2つのオプションのソリューションを投稿しました。

答えて

0

数時間の検索の後、私はシナリオ全体を把握しました。 ここにはいくつかの解決策があります。最初はもっと汚れています。なぜなら、これは最初に思いついたものですから、2番目の方がよりエレガントです。とにかく、私は両方とも一緒に去るつもりです。なぜなら、おそらく両方が誰かに便利になるからです。

S O L U T I O N - 私は解決策を把握するために一緒に作品を置くことができmit3zの助けに1つの

感謝。

彼が指摘するように、あなたがNSObjectの上のカテゴリに、このメソッドを実装することができます

- (NSArray *)c_propertyNames; 

は(この部分のコードとそれについての更なる詳細は、彼の応答を見て)

これが与えます私そんなことをする自由:

- (void) addLocation { 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *path = [documentsDirectory stringByAppendingPathComponent:@"/Locations.plist"]; 

    NSArray *keys = [curLocation c_propertyNames]; // retrieve all the keys for this obj 
    NSDictionary *values = [self.curLocation dictionaryWithValuesForKeys:keys]; 
    NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; 
    for(NSString *key in keys) { 
     NSString *aaa = [NSString stringWithFormat:@"%@", (NSString *)[values valueForKey:key]]; 
     [dict setValue:aaa forKey:key]; 
    } 

    [dict writeToFile:path atomically:YES]; 
} 

彼らはトンに書き込むことができるように、ループのsuperdumbがNSStringsにNSDictionaryの内のすべてのデータを変換するために必要とされます彼は困ったことのないファイルをplistします。辞書を作ってすぐにそれを保存しようとすると、あなたは成功しません。

このようにして、私はすべてのCLLocation objをdictに「シリアライズ」してplistファイルに書き込むことができます。

S O L U T I O N - 2

私はこれを行うには本当に最も簡単な(そしてよりエレガントな)方法を思いついた:NSCodingを使用。 ため、実際のCLLocationデータ型がNSCodingに準拠(私は気づいていること)、あなたがそのように、あなたの配列を記述したブロブを取得し、右側のplistにそれを保存するためにNSKeyedArchiverを介してデータアーカイバを呼び出すことができます。

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"/Locations.plist"]; 
NSMutableDictionary *data = [[NSMutableDictionary alloc] initWithContentsOfFile: path]; 

[data setValue:[NSKeyedArchiver archivedDataWithRootObject:arrayOfLocations] forKey:@"LocationList"]; 
[data writeToFile:path atomically:YES]; 
[data release]; 

およびvoila '。そのような単純な! :)あなたが簡単にあなたのデータを取り戻すことができます同じ原理に基づいて、

、 NSKeyUnarchiver 経由:

self.arrayOfLocations = [[NSMutableArray alloc] initWithArray:[NSKeyedUnarchiver unarchiveObjectWithData: (NSData *)[dict objectForKey:@"LocationList"]]]; 
3

KVCではかなり簡単です。その辞書を保存し

NSArray *keys = [yourLocation c_propertyNames]; 
NSDictionary *dict = [yourLocation dictionaryWithValuesForKeys:keys]; 

ここでは、プロパティ名を取得するにはNSObjectのカテゴリの方法(<objc/runtime.h>が必要です)

- (NSArray *)c_propertyNames { 
    Class class = [self class]; 
    u_int count = 0; 

    objc_property_t *properties = class_copyPropertyList(class, &count); 
    if (count <= 0) { 
     return nil; 
    } 
    NSIndexSet *set = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, count)]; 

    NSMutableSet *retVal = [NSMutableSet setWithCapacity:count]; 
    [set enumerateIndexesWithOptions:NSEnumerationConcurrent 
          usingBlock:^(NSUInteger idx, BOOL *stop) { 
           const char *propName = property_getName(properties[idx]); 
           NSString *name = [NSString stringWithUTF8String:propName]; 
           [retVal addObject:name]; 
          }]; 
    return [retVal allObjects]; 
} 

は、このようにそれを使用します。

+0

カテゴリコードはうまくいきます。「キー」NSArrayにデータが読み込まれますが、[dict writeToFile:path automatically:YES]を実行すると直ちに終了します。何もファイルに書かれていない。必要に応じて、質問を相対コードで更新しました。どうも! – holographix

+0

ok私はもう少し実験をしましたが、NSDictionaryのkey "clientLocation"の要素を含めるとplistファイルには書き込まれません。そうでなければ魅力的に機能することがわかりました。これは、そのフィールドがかなりの文字数の文字列である可能性があります。<00000000 ffff0000 94092907 20413b40 6a5c4eeb 797455c0 a6f71fc4 7fde7d40 00000000 00000000 00000000 0000f0bf 00000000 0000f0bf 00000000 0000f0bf 00000000 0000f0bf 00000000 0000f0bf 00000000 0000f0bf 00000000 0000f0bf bc043f09 c140b541 64000000 00000000 00000040 00000000> – holographix

+0

私はループを介してデータを解析するために謎解きを解決しなければなりませんでした。自分のコードをあなたのものと組み込んだ別のソリューションを投稿します。 – holographix

3

は私が好きsolution 2が、すべて1がやろうとした場合のシリアル化が簡単になることができ、ストレートへの書き込みでありますファイル。

[NSKeyedArchiver archiveRootObject:arrayOfLocations toFile:path]; 
+0

本当にいいです:)。 – holographix

関連する問題