gpt4 book ai didi

ios - 在重新启动 iOS 之前,此保存的数据似乎无法访问

转载 作者:行者123 更新时间:2023-11-29 02:41:06 24 4
gpt4 key购买 nike

我有一个自定义的 NSCoding 类,它在必要时存储和检索自身。但是,它不会向我的 TableView 提供数据,直到向其中的自定义 Person 对象数组提供一个条目并重新启动应用程序,然后再提供另一个条目。然而,第一个消失了。

在那之后,它似乎加载正常。

类的实现

#import "DataStorage.h"

@implementation DataStorage


@synthesize arrayOfPeople = _arrayOfPeople;

+ (DataStorage *)sharedInstance
{
static DataStorage *state = nil;
if ( !state )
{
NSData *data =[[NSUserDefaults standardUserDefaults] objectForKey:@"DataStorageBank"];

if (data)
{
state = [NSKeyedUnarchiver unarchiveObjectWithData:data];
}
else
{
state = [[DataStorage alloc] init];
}
}
return state;
}

- (instancetype)initWithCoder:(NSCoder *)decoder
{
self = [self init];
if (self) {


if ([decoder decodeObjectForKey:@"DataStoragePeopleArray"]) {
_arrayOfPeople = [[decoder decodeObjectForKey:@"DataStoragePeopleArray"] mutableCopy];
} else {
_arrayOfPeople = [[NSMutableArray alloc] init];
}



}
return self;
}

- (void)encodeWithCoder:(NSCoder *)encoder {
[encoder encodeObject:_arrayOfPeople forKey:@"DataStoragePeopleArray"];
}

- (void)save
{
NSData *appStateData = [NSKeyedArchiver archivedDataWithRootObject:self];
[[NSUserDefaults standardUserDefaults] setObject:appStateData forKey:@"DataStorageBank"];
}


@end

我将对象添加到 _arrayOfPeople 中,如下所示:

Person *person = [[Person alloc] initWithFirstName:firstName personSurname:surname personCompay:company personPosition:position personEmail:email personMobile:mobile personProduct:product];

[[DataStorage sharedInstance].arrayOfPeople addObject:person];
[[DataStorage sharedInstance] save];

并通过以下方式将它们加载到 TableView 中:

Person *personAtIndex = [[DataStorage sharedInstance].arrayOfPeople objectAtIndex:indexPath.row];
[_arrayOfPeople addObject:personAtIndex];
cell.textLabel.text = personAtIndex.firstName;
cell.detailTextLabel.text = personAtIndex.surname;

将它们加载到 TableView 中是在方法中

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

最佳答案

看起来您只在 initWithCoder: 中初始化了 _arrayOfPeople。但是,如果您的数据不存在于用户默认值中,您可以使用 state = [[DataStorage alloc] init] 来初始化您的共享实例。这不会调用 initWithCoder: 所以 _arrayOfPeoplenil 直到你保存并再次加载,当它最终被初始化为 [[ NSMutableArray alloc] init].要解决此问题,请将 _arrayOfPeople = [[NSMutableArray alloc] init]initWithCoder: 移到 init 中。 (您也可以将它移动到 sharedInstance 中,但它在 init 中更有意义,因为它并不特定于配置共享实例。)

无关,但也要确保同步。

- (void)save
{
NSData *appStateData = [NSKeyedArchiver archivedDataWithRootObject:self];
[[NSUserDefaults standardUserDefaults] setObject:appStateData forKey:@"DataStorageBank"];
[[NSUserDefaults standardUserDefaults] synchronize];
}

关于ios - 在重新启动 iOS 之前,此保存的数据似乎无法访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25789937/

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