)
在我想用 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/
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t
设置:狂欢ruby1.9.2高线(1.6.13)描述:我已经相当习惯在其他一些项目中使用highline,但已经有几个月没有使用它了。现在,在Ruby1.9.2上全新安装时,它似乎不允许在同一行回答提示。所以以前我会看到类似的东西:require"highline/import"ask"Whatisyourfavoritecolor?"并得到:Whatisyourfavoritecolor?|现在我看到类似的东西:Whatisyourfavoritecolor?|竖线(|)符号是我的终端光标。知道为什么会发生这种变化吗? 最佳答案
我在我的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服务器更新战俘
我需要检查DateTime是否采用有效的ISO8601格式。喜欢:#iso8601?我检查了ruby是否有特定方法,但没有找到。目前我正在使用date.iso8601==date来检查这个。有什么好的方法吗?编辑解释我的环境,并改变问题的范围。因此,我的项目将使用jsapiFullCalendar,这就是我需要iso8601字符串格式的原因。我想知道更好或正确的方法是什么,以正确的格式将日期保存在数据库中,或者让ActiveRecord完成它们的工作并在我需要时间信息时对其进行操作。 最佳答案 我不太明白你的问题。我假设您想检查
这里有一个很好的答案解释了如何在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返回它复制的字节数,但是当我还没有下
如果我使用ruby版本2.5.1和Rails版本2.3.18会怎样?我有基于rails2.3.18和ruby1.9.2p320构建的rails应用程序,我只想升级ruby的版本,而不是rails,这可能吗?我必须面对哪些挑战? 最佳答案 GitHub维护apublicfork它有针对旧Rails版本的分支,有各种变化,它们一直在运行。有一段时间,他们在较新的Ruby版本上运行较旧的Rails版本,而不是最初支持的版本,因此您可能会发现一些关于需要向后移植的有用提示。不过,他们现在已经有几年没有使用2.3了,所以充其量只能让更
我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的
我想这样组织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中)将被完全忽略。
1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里
我最喜欢的Google文档功能之一是它会在我工作时不断自动保存我的文档版本。这意味着即使我在进行关键更改之前忘记在某个点进行保存,也很有可能会自动创建一个保存点。至少,我可以将文档恢复到错误更改之前的状态,并从该点继续工作。对于在MacOS(或UNIX)上运行的Ruby编码器,是否有具有等效功能的工具?例如,一个工具会每隔几分钟自动将Gitcheckin我的本地存储库以获取我正在处理的文件。也许我有点偏执,但这点小保险可以让我在日常工作中安心。 最佳答案 虚拟机有些人可能讨厌我对此的回应,但我在编码时经常使用VIM,它具有自动保存功