【问题标题】:Encode NSMutableArray编码 NSMutableArray
【发布时间】:2013-03-24 16:24:26
【问题描述】:

编辑:好的,我决定将数组保存在 userDefaults... 应该很容易,对吧? 保存:

NSUserDefaults *userDefs = [NSUserDefaults standardUserDefaults];
    [userDefs setObject:videoArray forKey:@"dataArray"];
    [userDefs synchronize];

加载:

 NSUserDefaults *userDefs = [NSUserDefaults standardUserDefaults];
    videoArray = [[NSUserDefaults standardUserDefaults] mutableArrayValueForKey:@"dataArray"];

    [tableview reloadData];
    NSLog(@"%@",videoArray);

数组中对象的类别:

@interface DEVideoModel : NSObject

@property (copy) NSString *name;
@property (copy) NSImage *thumbnail;
@property (copy) NSDictionary *qualities;
@property (readwrite) float videoSize;
@property (readwrite) float progress;
@property (copy) NSString *filePath;
@property (copy) NSDate *datum;


@end

@synthesize name,filePath,videoSize,qualities,thumbnail,datum,progress;
-(id)init {
    self = [super init];
    if(self) {
        qualities = [[NSDictionary alloc]init];
        thumbnail = [[NSImage alloc]init];
    }
    return self;
}


@end

当我加载它时,我的 videoArray 是(null)?!我不明白。顺便说一下,videoArray 是一个 NSMutableArray 而不是 NSArray。

【问题讨论】:

  • encodeWithcoder 方法被调用了吗?
  • 啊,我明白了,encodeWithCoder 没有被调用。我错过了什么 ?在我的 .h 中,我实现了
  • 旁注:您是否创建了NSApplicationSupportDirectory?应用沙箱中默认不存在该目录。此外,不要使用字符串格式来创建路径。使用NSString *path = [appSupportDir stringByAppendingPathComponent:@"DEConvert.dat"];
  • 嗯好的,我将更改获取路径的方式,但文件保存在此目录中。 (目前我的应用没有沙盒)
  • @DavidEhlen 抱歉,关于目录不存在的评论适用于 iOS,而不适用于 OSX。请忽略那部分。

标签: objective-c cocoa nsmutablearray nscoding


【解决方案1】:

在您的代码中,您将 NSData 写入 NSCoder,因此您需要读取 NSData 然后将其转换为数组。

NSURL *appSupportDir = [[NSFileManager defaultManager] URLForDirectory:NSApplicationSupportDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:YES error:&error];
NSString *path = [NSString stringWithFormat:@"%@/DEConvert.dat",[appSupportDir path]];
NSLog(@"%@",appSupportDir);
NSData *data = [NSData dataWithContentsOfFile:path];
NSMutableArray *arr = [NSKeyedUnarchiver unarchiveObjectWithData:data];

在 NSUserDefault 中存储对象

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:arr];
[[NSUserDefaults standardUserDefaults] setObject:data forKey:@"your key"];

取消归档同样简单:

NSData *NewData = [[NSUserDefaults standardUserDefaults] objectForKey:@"your key"];
NSArray *arr = [NSKeyedUnarchiver unarchiveObjectWithData:NewData];

【讨论】:

  • 我得到这个输出:*** -[NSKeyedUnarchiver initForReadingWithData:]: data is NULL
  • 我已经编辑了答案,我忘了在我们正在阅读的路径中添加文件名。请立即尝试,不便之处敬请见谅。祝你好运
  • 是的,我看到并自己纠正了它。现在输出很好(没有更多错误),但保存肯定是错误的。我查看了保存的 .dat 文件:// !!! BINARY PROPERTY LIST WARNING !!! // // The pretty-printed property list below has been created // from a binary version on disk and should not be saved as // the ASCII format is a subset of the binary representation! // { "$archiver" = "NSKeyedArchiver"; "$objects" = ( "$null" ); "$top" = { root = :false; }; "$version" = 100000; }
  • 亲爱的朋友,你为什么要把它保存在文件中。将其保存在 NSUserDefault 中。让我给你一个示例代码。
  • 我认为这将是“正确干净”的方式。如果可以接受将其保存在 NSUserDefaults 中,我想我会自己完成这项工作
猜你喜欢
  • 1970-01-01
  • 2013-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多