【问题标题】:NSKeyedArchiver .plist appending problemNSKeyedArchiver .plist 附加问题
【发布时间】:2011-09-08 17:36:52
【问题描述】:

**

  1. 我正在从表单中获取数据到数组中,并尝试使用 NSKeyedArchiver 将该数组写入 .plist 文件。
  2. 写入成功,但是每当我运行脚本时它都会覆盖以前的数据。
  3. 如何将新数据附加到 .plist 文件而不是覆盖?

**

@implementation Player

- (id)init
{
    self = [super init];
    if (self) {
        // Initialization code here.
    }
    return self;
}

- (void)dealloc
{
    [super dealloc];
}

- (IBAction)savePlayer:(id)sender {
    NSString *path = @"/Users/username/fm.plist";
    NSString *pl= [teamPlayer stringValue];
    NSString *name = [namePlayer stringValue];
    NSString *age = [agePlayer stringValue];
    NSString *position= [positionPlayer stringValue];
    Player *player = [[Player alloc] init];

    array = [[NSMutableArray alloc] initWithObjects:pl,
                                  name, age, position, nil];

    [NSKeyedArchiver archiveRootObject:array toFile:path];
    NSString *ns = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
    NSLog(@"test: %@" , ns);
    [array release];
}

- (void) encodeWithCoder: (NSCoder *) coder{
    [coder encodeObject:array forKey:@"someArray"];
}

- (void) decodeWithCoder: (NSCoder *) coder{
    [coder decodeObjectForKey:@"someArray"];
    return self;
}

【问题讨论】:

  • 我忘记添加收到的错误:无法识别的选择器已发送到实例

标签: objective-c cocoa nskeyedarchiver


【解决方案1】:

首先,最后两种方法似乎不相关,因为您没有编码这些方法所属的任何对象。同样,NSCoding 协议包括encodeWithCoder:initWithCoder: 方法。 NSCoding 协议中没有 decodeWithCoder: 方法。

其次,您正在创建一个新的NSMutableArray 对象,该对象使用少量元素进行初始化,并将其归档到一个文件中,以便覆盖现有文件。您将需要通过取消归档文件、创建可变副本然后附加值来获取现有数组。所以代码会是这样的,

NSArray *existingValues = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
NSArray *newValues = [existingValues copy];
[newValues addObjectsFromArray:[NSArray arrayWithObjects:pl, name, age, position, nil]];
[NSKeyedArchiver archiveRootObject:newValues toFile:path];
[newValues release];

【讨论】:

  • 感谢您的回答。但是这种方法看起来效率低下。每次用户从表单输入数据时,它需要复制并写入总对象。
  • 如果你正在考虑存储表单数据,你应该看看Core Data。对于这样的事情,这绝对是低效的。
  • 如果你经常这样做以至于你需要担心效率,你应该在内存中保留一个可变版本的结构,并且每次都修改和写入。或者你应该使用不同的存储系统,比如 Core Data。您不能附加到磁盘 plist;格式不允许。
  • 谢谢迪帕克!我注意到我的错误是使用 decodeWithCoder 而没有这样的方法,我应该使用 initWithCoder 代替。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多