jjzjj

ios - NSObject 在编码后不会与 NSUserDefaults 一起保存

coder 2024-01-17 原文

)

在我想用 NSUserDefaults 保存它之前,我的 NSObject 没有被正确编码

这是我的代码:

NSUserDefaults *userDefault=[NSUserDefaults standardUserDefaults];

NSLog(@"Favorite artists before encode: %@", self.model.favoriteArtists);

NSData *myEncodedObject = [NSKeyedArchiver archivedDataWithRootObject:self.model];
                        [userDefault setObject:myEncodedObject forKey:[NSString stringWithFormat:@"Favorites"]];

[userDefault synchronize];


NSData *myDecodedObject = [userDefault objectForKey: [NSString stringWithFormat:@"Favorites"]];

self.model=[NSKeyedUnarchiver unarchiveObjectWithData: myDecodedObject];

NSLog(@"Favorite artists after encode: %@",self.model.favoriteArtists); 

编码前控制台的输出是这样的:

Favorite artists before encode: (
    "<SBQArtistModel: 0x15671d30>"
)

编码后控制台输出:

Favorite artists after encode: (
)

为什么什么都没有保存?

我真的被这个困住了。代码似乎是正确的,但我不明白发生了什么。

谢谢

编辑

我在我的 NSObject 类中实现了 NSCoding 协议(protocol)并实现了 initWithCoder:encodeWithCoder: NSObject .m.

上的方法

.h 中的代码:

@interface SBQAllArtistsModel : NSObject <NSCoding>

.m 中的代码:

- (void)encodeWithCoder:(NSCoder *)encoder
{

    //Encode properties, other class variables, etc
    [encoder encodeObject:self.artists forKey:@"artists"];
    [encoder encodeObject:self.items forKey:@"items"];
    [encoder encodeObject:self.arrays forKey:@"arrays"];
    [encoder encodeObject:self.artistFav forKey:@"artistFav"];

}
- (id)initWithCoder:(NSCoder *)decoder
{
    self = [super init];
    if( self != nil )
    {
        self.artists = [decoder decodeObjectForKey:@"artists"];
        self.items = [decoder decodeObjectForKey:@"items"];
        self.arrays = [decoder decodeObjectForKey:@"arrays"];
        self.artistFav = [decoder decodeObjectForKey:@"artistFav"];

    }
    return self;
}

-(NSArray *)favoriteArtists{
    NSPredicate *predicate = [NSPredicate predicateWithFormat: @"Favorite == YES"];
    return [self.artists filteredArrayUsingPredicate: predicate];
}

最佳答案

我得到了解决方案。

我有两个 NSObject,一个保存我所有的艺术家,每个艺术家一个。因此,在我保存艺术家信息的 NSObject 中,我有一个 BOOL 值,如果我选择艺术家作为收藏夹,我会在其中存储该值。我没有将这个 BOOL 值添加到他的 NSCoding 协议(protocol)方法中,因为 BOOL 不是一个对象,我不能,所以我创建了一个 NSNumber 来存储 Favorite 的值,在我添加它之后NSCoding 协议(protocol)方法,运行良好。

我的 Artist NSObject 中的代码。

.h

@interface SBQArtistModel : NSObject <NSCoding>

@property (strong, nonatomic) NSString *name;
@property (strong, nonatomic) NSString *bio;
@property (strong, nonatomic) NSString *location;
@property (strong, nonatomic) NSString *linkSoundcloud;
@property (strong, nonatomic) NSString *linkFacebook;
@property (strong, nonatomic) NSString *thumbnail;
@property (strong, nonatomic) NSString *image;
@property (strong, nonatomic) NSNumber *numberFavorite;
@property (nonatomic) BOOL Favorite;

.m

- (void)encodeWithCoder:(NSCoder *)encoder
{


    [encoder encodeObject:self.name forKey:@"name"];
    [encoder encodeObject:self.bio forKey:@"bio"];
    [encoder encodeObject:self.location forKey:@"location"];
    [encoder encodeObject:self.linkSoundcloud forKey:@"linkSoundcloud"];
    [encoder encodeObject:self.linkFacebook forKey:@"linkFacebook"];
    [encoder encodeObject:self.thumbnail forKey:@"thumbnail"];
    [encoder encodeObject:self.image forKey:@"image"];
    [encoder encodeObject:self.numberFavorite forKey:@"numberFavorite"];

}

- (id)initWithCoder:(NSCoder *)decoder
{
    self = [super init];
    if( self != nil )
    {
        self.name = [decoder decodeObjectForKey:@"name"];
        self.bio = [decoder decodeObjectForKey:@"bio"];
        self.location = [decoder decodeObjectForKey:@"location"];
        self.linkSoundcloud = [decoder decodeObjectForKey:@"linkSoundcloud"];
        self.linkFacebook = [decoder decodeObjectForKey:@"linkFacebook"];
        self.thumbnail = [decoder decodeObjectForKey:@"thumbnail"];
        self.image = [decoder decodeObjectForKey:@"image"];
        self.numberFavorite = [decoder decodeObjectForKey:@"numberFavorite"];

    }
    return self;
}

谢谢,我希望解释得很好 ;)

关于ios - NSObject 在编码后不会与 NSUserDefaults 一起保存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22225940/

有关ios - NSObject 在编码后不会与 NSUserDefaults 一起保存的更多相关文章

  1. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

  2. ruby - Highline 询问方法不会使用同一行 - 2

    设置:狂欢ruby1.9.2高线(1.6.13)描述:我已经相当习惯在其他一些项目中使用highline,但已经有几个月没有使用它了。现在,在Ruby1.9.2上全新安装时,它似乎不允许在同一行回答提示。所以以前我会看到类似的东西:require"highline/import"ask"Whatisyourfavoritecolor?"并得到:Whatisyourfavoritecolor?|现在我看到类似的东西:Whatisyourfavoritecolor?|竖线(|)符号是我的终端光标。知道为什么会发生这种变化吗? 最佳答案

  3. ruby-on-rails - 项目升级后 Pow 不会更改 ruby​​ 版本 - 2

    我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby​​版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby​​版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘

  4. ruby-on-rails - Ruby 检查日期时间是否为 iso8601 并保存 - 2

    我需要检查DateTime是否采用有效的ISO8601格式。喜欢:#iso8601?我检查了ruby​​是否有特定方法,但没有找到。目前我正在使用date.iso8601==date来检查这个。有什么好的方法吗?编辑解释我的环境,并改变问题的范围。因此,我的项目将使用jsapiFullCalendar,这就是我需要iso8601字符串格式的原因。我想知道更好或正确的方法是什么,以正确的格式将日期保存在数据库中,或者让ActiveRecord完成它们的工作并在我需要时间信息时对其进行操作。 最佳答案 我不太明白你的问题。我假设您想检查

  5. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  6. ruby-on-rails - 如果我将 ruby​​ 版本 2.5.1 与 rails 版本 2.3.18 一起使用会怎样? - 2

    如果我使用ruby​​版本2.5.1和Rails版本2.3.18会怎样?我有基于rails2.3.18和ruby​​1.9.2p320构建的rails应用程序,我只想升级ruby的版本,而不是rails,这可能吗?我必须面对哪些挑战? 最佳答案 GitHub维护apublicfork它有针对旧Rails版本的分支,有各种变化,它们一直在运行。有一段时间,他们在较新的Ruby版本上运行较旧的Rails版本,而不是最初支持的版本,因此您可能会发现一些关于需要向后移植的有用提示。不过,他们现在已经有几年没有使用2.3了,所以充其量只能让更

  7. Ruby 文件 IO 定界符? - 2

    我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的

  8. c - mkmf 在编译 C 扩展时忽略子文件夹中的文件 - 2

    我想这样组织C源代码:+/||___+ext||||___+native_extension||||___+lib||||||___(Sourcefilesarekeptinhere-maycontainsub-folders)||||___native_extension.c||___native_extension.h||___extconf.rb||___+lib||||___(Rubysourcecode)||___Rakefile我无法使此设置与mkmf一起正常工作。native_extension/lib中的文件(包含在native_extension.c中)将被完全忽略。

  9. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  10. ruby-on-rails - 有没有一种工具可以在编码时自动保存对文件的增量更改? - 2

    我最喜欢的Google文档功能之一是它会在我工作时不断自动保存我的文档版本。这意味着即使我在进行关键更改之前忘记在某个点进行保存,也很有可能会自动创建一个保存点。至少,我可以将文档恢复到错误更改之前的状态,并从该点继续工作。对于在MacOS(或UNIX)上运行的Ruby编码器,是否有具有等效功能的工具?例如,一个工具会每隔几分钟自动将Gitcheckin我的本地存储库以获取我正在处理的文件。也许我有点偏执,但这点小保险可以让我在日常工作中安心。 最佳答案 虚拟机有些人可能讨厌我对此的回应,但我在编码时经常使用VIM,它具有自动保存功

随机推荐