开发者社区 问答 正文

Bool正在为目标c中的值0返回yes?

我有过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秒的差别。

展开
收起
游客5akardh5cojhg 2019-12-13 14:16:26 470 分享 版权
阿里云 AI 助理回答

从你的描述来看,问题似乎出在NSManagedObjects(Core Data模型对象)与原始数据类型的转换上,特别是当你尝试将存储在模型中的“ Invisible”属性作为布尔值处理时。

在Core Data中,即使你期望一个属性是布尔类型,它实际上可能被存储为字符串(如"YES"/"NO")或其他非直接布尔格式。这可能是为什么你直接用[self.model objectForKey:@"Invisible"]获取到的是一个_NSCFBoolean对象,但实际的逻辑处理出现了问题的原因。

你的isInvisible getter方法已经尝试通过boolValue来正确地转换这个值,理论上这应该能解决问题。但是,根据你的更新,这个方法在连续调用时表现不一致,这很可能是由于Core Data上下文管理或模型对象状态的问题。

这里有几个可能的解决方案和检查方向:

  1. 刷新 Managed Object Context: 在连续调用isInvisible之前,确保没有其他操作(比如后台线程的保存、更改监控等)正在修改这个Filter对象的Invisible属性。如果有可能,尝试在再次检查isInvisible前手动刷新托管对象上下文:

    [self.managedObjectContext refreshObject:self.model mergeChanges:YES];
    
  2. 检查数据一致性: 确认数据库中该记录的"Invisible"字段是否在两次查询之间保持不变。有时候,调试器之外的因素(如其他代码部分、多线程操作等)可能会导致数据变化。

  3. 日志记录和调试: 在isInvisible方法内添加更详细的日志输出,包括直接打印[self.model objectForKey:@"Invisible"]的原始值和类型,以及每次调用前后执行的任何相关操作,以便更好地追踪问题来源。

  4. 考虑使用Core Data的属性映射: 如果你还没有这么做,可以考虑直接在你的Core Data模型中将"Invisible"属性映射为布尔型(Boolean),这样Core Data会自动处理类型转换。不过,这需要修改数据模型并可能重新生成模型类文件。

  5. 检查多线程问题: 确保所有对Filter对象的操作都在同一个线程上进行,避免多线程并发访问导致的数据不一致。

如果以上建议都不能解决你的问题,可能需要更深入地调查你的应用程序逻辑,特别是关于如何以及何时修改和读取Invisible属性的部分。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答地址: