我有过Invisible = 0在我的模特儿里,我正试着把这个弄进去BOOL用这条线。
BOOL invisible = [self.model objectForKey:@"Invisible"]; 但看不见的是“是”而不是“否”。我也试过了,但这也是真的。我使用[[self.model objectForKey:@"Invisible"] class]它显示的是_NSCF布尔。这里怎么了?模型是NSD的。
https://i.stack.imgur.com/Hmm20.png
更新
好吧,所以我找到了真正的问题。我有Filter类,其中有getter是不可见的,代码是
- (BOOL)isInvisible {
return [[self.model objectForKey:@"Invisible"] boolValue];
}
当我第一次打电话的时候,它会对我说不。这很好。在那之后,我再次调用它,它又回来了。奇怪。
(lldb) po filter.isInvisible
NO
(lldb) po filter.isInvisible
<nil>
两个po命令之间只有1秒的差别。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
从你的描述来看,问题似乎出在NSManagedObjects
(Core Data模型对象)与原始数据类型的转换上,特别是当你尝试将存储在模型中的“ Invisible”属性作为布尔值处理时。
在Core Data中,即使你期望一个属性是布尔类型,它实际上可能被存储为字符串(如"YES"/"NO")或其他非直接布尔格式。这可能是为什么你直接用[self.model objectForKey:@"Invisible"]
获取到的是一个_NSCFBoolean
对象,但实际的逻辑处理出现了问题的原因。
你的isInvisible
getter方法已经尝试通过boolValue
来正确地转换这个值,理论上这应该能解决问题。但是,根据你的更新,这个方法在连续调用时表现不一致,这很可能是由于Core Data上下文管理或模型对象状态的问题。
这里有几个可能的解决方案和检查方向:
刷新 Managed Object Context: 在连续调用isInvisible
之前,确保没有其他操作(比如后台线程的保存、更改监控等)正在修改这个Filter
对象的Invisible
属性。如果有可能,尝试在再次检查isInvisible
前手动刷新托管对象上下文:
[self.managedObjectContext refreshObject:self.model mergeChanges:YES];
检查数据一致性: 确认数据库中该记录的"Invisible"字段是否在两次查询之间保持不变。有时候,调试器之外的因素(如其他代码部分、多线程操作等)可能会导致数据变化。
日志记录和调试: 在isInvisible
方法内添加更详细的日志输出,包括直接打印[self.model objectForKey:@"Invisible"]
的原始值和类型,以及每次调用前后执行的任何相关操作,以便更好地追踪问题来源。
考虑使用Core Data的属性映射: 如果你还没有这么做,可以考虑直接在你的Core Data模型中将"Invisible"属性映射为布尔型(Boolean
),这样Core Data会自动处理类型转换。不过,这需要修改数据模型并可能重新生成模型类文件。
检查多线程问题: 确保所有对Filter
对象的操作都在同一个线程上进行,避免多线程并发访问导致的数据不一致。
如果以上建议都不能解决你的问题,可能需要更深入地调查你的应用程序逻辑,特别是关于如何以及何时修改和读取Invisible
属性的部分。