数時間の検索の後、シナリオ全体を把握しました。ここにいくつかの解決策があります。最初のものは、私が思いついた最初のものなので、より「汚い」ものですが、2番目のものはよりエレガントです。いずれにせよ、どちらも誰かの役に立つかもしれないので、両方とも残しておきます。
解決策 — 1
mit3z の助けを借りて、解決策を見つけるために断片をまとめることができました。
彼が指摘するように、このメソッドを 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];
}
NSDictionary 内のすべてのデータを NSStrings に変換するには、superdumb for ループが必要です。これにより、問題なく plist ファイルに書き込むことができます。辞書を作成してすぐに保存しようとすると、成功しません。 .
このようにして、すべての CLLocation obj を dict に「シリアル化」してから、plist ファイルに書き込むことができます。
解決策 — 2
これを行うための非常に簡単な (そしてよりエレガントな) 方法を思いつきました: NSCodingを使用します。CLLocationデータ型がNSCodingに準拠していることに気付いたという事実により、NSKeyedArchiverを介してデータ アーカイバーを呼び出して、配列を説明する blob を取得し、次のように plist に保存することができます。
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];
そしてほら」。そのような単純な!:)
同じ原則に基づいて、NSKeyUnarchiverを介して簡単にデータを取り戻すことができます:
self.arrayOfLocations = [[NSMutableArray alloc] initWithArray:[NSKeyedUnarchiver unarchiveObjectWithData: (NSData *)[dict objectForKey:@"LocationList"]]];