gpt4 book ai didi

iphone - NSKeyedArchiver 文件 - 丢失数据

转载 作者:行者123 更新时间:2023-12-03 19:42:57 25 4
gpt4 key购买 nike

使用 iPhone SDK 3.1.2。我正在使用 NSKeyedArchiver 对象将一些信息保存到文件中。我有4把 key 。我从 applicationDidFinshLaunching 上的文件中读取所有 4 个键的数据,并在 applicationDidTerminate 上写回文件(所有 4 个键)。此外,当用户保存任何信息时,我会为其特定的 key 写入数据。

如果最初没有文件,我会为帐户列表分配一个数组,这允许我向其中添加帐户。

我遇到文件定期丢失保存到其中的数据的问题。有时是一键受影响,即帐户列表,有时是收藏夹列表。如果我只保存 1 个键而不是所有 4 个键,情况似乎会更加严重。我使用 Organier 查看了该文件数据确实丢失了。问题是很多时候它不起作用。我不明白为什么它如此不一致。另外,如果我终止 xcode 中的调试器,我希望只会丢失最近的更改,而不是似乎确实发生的整个文件数据。整个 NSKeyedArchiv er 的事情看起来很不稳定,我正在考虑另一种持久存储策略。任何人都遇到过这样的事情。

- (void)viewDidLoad 
{

if( self.accountList == nil)
{
NSMutableArray *array = [[NSMutableArray alloc] init];
self.accountList = array;
[array release];
}

if( self.phoneSettings == nil)
{
PhoneSettings* mySettings = [[PhoneSettings alloc] initSettings];
self.phoneSettings = mySettings;
[mySettings release];
}



NSString *filePath = [self dataFilePath];
if ([[NSFileManager defaultManager] fileExistsAtPath:filePath]) {
NSData *data = [[NSMutableData alloc]
initWithContentsOfFile:[self dataFilePath]];
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc]
initForReadingWithData:data];
NSMutableArray *archiveArray = [unarchiver decodeObjectForKey:kDataKey];
if(archiveArray != nil)
self.accountList = [archiveArray retain];
else
LOG("No archived accounts" );

NSMutableArray *archiveCallList = [unarchiver decodeObjectForKey:kCallListKey];
if(archiveCallList !=nil)
appDelegate.callList = [archiveCallList retain];

NSMutableArray *archiveFavouritesList = [unarchiver decodeObjectForKey:kfavouritesKey];
if(archiveFavouritesList != nil)
appDelegate.favouritesList = [archiveFavouritesList retain];

PhoneSettings* archiveSettings = [unarchiver decodeObjectForKey:kPhoneSettings];
if (archiveSettings != nil)
self.phoneSettings = [archiveSettings retain];

[unarchiver finishDecoding];
[unarchiver release];
[data release];
}

然后在

- (void)applicationWillTerminate:(NSNotification *)notification {

LOG("Application terminating");
SessionTalkAppDelegate* appDelegate = (SessionTalkAppDelegate*)[[UIApplication sharedApplication] delegate];




NSMutableData *data = [[NSMutableData alloc] init];
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc]
initForWritingWithMutableData:data];
[archiver encodeObject:self.accountList forKey:kDataKey];
[archiver encodeObject:appDelegate.callList forKey:kCallListKey];
[archiver encodeObject:appDelegate.favouritesList forKey:kfavouritesKey];
[archiver encodeObject:self.phoneSettings forKey:kPhoneSettings];
[archiver finishEncoding];

[data writeToFile:[self dataFilePath] atomically:YES];
[archiver release];
[data release];
}

最佳答案

您不需要那么多代码。保存您的数据:

NSMutableDictionary *appState = [NSMutableDictionary dictionary];
[appState setObject: self.accountList forKey: kDataKey];
[appState setObject: appDelegate.callList forKey: kCallListKey];
[appState setObject: self.phoneSettings forKey: kPhoneSettings];
if ( [NSKeyedArchiver archiveRootObject: appState toFile: [self dataFilePath]] == NO )
NSLog(@"Failed to archive %@", appState);

读取数据:

NSMutableDictionary *appState = [NSKeyedUnarchiver unarchiveObjectWithFile: [self dataFilePath]];

请注意,如果文件不包含有效的存档,NSKeyedUnarchiver 可能会引发 NSInvalidArgumentException,因此您应该将调用包含在 @try{} block 中。

关于iphone - NSKeyedArchiver 文件 - 丢失数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2156073/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com