Saya menemukan satu alternatif, sebelum menyimpan, saya menyandikan objek root ( NSArray
objek) menggunakan NSKeyedArchiver
, yang berakhir dengan NSData
. Kemudian gunakan UserDefaults simpan NSData
.
Ketika saya membutuhkan data, saya membaca NSData
, dan gunakan NSKeyedUnarchiver
untuk mengkonversi NSData
kembali ke objek.
Agak rumit, karena saya perlu mengkonversi ke / dari NSData
setiap kali, tetapi hanya berfungsi.
Berikut ini satu contoh per permintaan:
Menyimpan:
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSMutableArray *arr = ... ; // set value
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:arr];
[defaults setObject:data forKey:@"theKey"];
[defaults synchronize];
Beban:
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSData *data = [defaults objectForKey:@"theKey"];
NSArray *arr = [NSKeyedUnarchiver unarchiveObjectWithData:data];
Elemen dalam array mengimplementasikan
@interface CommentItem : NSObject<NSCoding> {
NSString *value;
}
Kemudian dalam implementasi CommentItem
, menyediakan dua metode:
-(void)encodeWithCoder:(NSCoder *)encoder
{
[encoder encodeObject:value forKey:@"Value"];
}
-(id)initWithCoder:(NSCoder *)decoder
{
self.value = [decoder decodeObjectForKey:@"Value"];
return self;
}
Adakah yang punya solusi yang lebih baik?
Terimakasih semuanya.
Jika Anda menyimpan objek dalam default pengguna, semua objek, secara rekursif, sepenuhnya, harus objek daftar properti. Sesuai dengan NSCoding tidak berarti apa-apa di sini -
NSUserDefaults
tidak akan secara otomatis menyandikannyaNSData
, Anda harus melakukannya sendiri. Jika Anda "daftar objek yang mengimplementasikanNSCoding
" berarti objek yang bukan objek daftar properti, maka Anda harus melakukan sesuatu dengannya sebelum menyimpan ke default pengguna.FYI kelas daftar properti yang
NSDictionary
,NSArray
,NSString
,NSDate
,NSData
, danNSNumber
. Anda dapat menulis subclass yang dapat diubah (sepertiNSMutableDictionary
) ke preferensi pengguna tetapi objek yang Anda baca akan selalu tidak berubah.sumber
Apakah semua kunci Anda ada di kamus
NSString
? Saya pikir mereka harus untuk menyimpan kamus ke daftar properti.sumber
Jawaban Sederhana:
NSDictionary
hanya objek plist , jika kuncinya adalah NSStrings . Jadi, Simpan "Key" sebagaiNSString
denganstringWithFormat
.Solusi:
Manfaat:
NULL
.sumber
Sudahkah Anda mempertimbangkan untuk mengimplementasikan
NSCoding
Protokol? Ini akan memungkinkan Anda menyandikan dan mendekode pada iPhone dengan dua metode sederhana yang diterapkan denganNSCoding
. Pertama, Anda perlu menambahkanNSCoding
ke Kelas Anda.Berikut ini sebuah contoh:
Ini ada dalam file .h
Maka Anda perlu mengimplementasikan dua metode Protokol NSCoding.
Lihat dokumentasi di NSCoder untuk informasi lebih lanjut. Itu sangat berguna untuk proyek-proyek saya di mana saya harus menyimpan status aplikasi pada iPhone jika aplikasi ditutup dan mengembalikannya kembali ke keadaan saat kembali menyala.
Kuncinya adalah menambahkan protokol ke antarmuka dan kemudian menerapkan dua metode yang merupakan bagian dari
NSCoding
.Saya harap ini membantu!
sumber
Tidak ada solusi yang lebih baik. Pilihan lain adalah dengan hanya menyimpan objek kode ke disk - tetapi melakukan hal yang sama. Keduanya berakhir dengan NSData yang akan diterjemahkan ketika Anda menginginkannya kembali.
sumber