【问题标题】:Core Data NSNumber overkill?核心数据 NSNumber 矫枉过正?
【发布时间】:2012-08-17 01:44:03
【问题描述】:

我应该使用 NSNumber 还是字符串来保存一个简单的“玩家 ID 号”,现在它是一个整数,因为我想用 Core Data 保存它?

在我的数据模型中,我将 playerID 设置为整数 16,但核心数据希望 NSNumber 能够正常工作。这似乎是很多“无”的代码 - 示例;

NSInteger myValue = 1;
NSNumber *number = [NSNumber numberWithInteger:myValue];
p1.playerID = number;

// Instead of just;
p1.playerID = 1;
// or
p1.playerID.myIntValue;

只是想知道将其设置为字符串然后根据需要来回转换值(playerID)是否更容易?对此有何智慧(经验)?谢谢:-)

【问题讨论】:

  • 您是否担心您的代码会变得复杂?还是担心速度慢?

标签: ios core-data nsnumber


【解决方案1】:

NSNumber 在内存中存储值比 NSString 更有效。因为 NSNumber 使用称为标记指针的运行时工具来提高速度并减少内存使用 (See more information)

另外我认为 NSNumber 在 CoreData 中占用的空间比 NSString 少。

【讨论】:

    【解决方案2】:

    在您的实体上,像这样定义@property

    @property (nonatomic) int32_t playerID;
    

    然后你就可以简单地设置它

    p1.playerID = 1;
    

    这非常优雅且非常快速。

    换句话说,不要将其定义为NSNumber *。但即使你这样做了,性能仍然很出色。像这样阅读和编写代码更容易。另请注意,对于最新的 Xcode 版本,您可以使用 @(myInt) 代替 [NSNumber numberWithInt:myInt]

    请务必查看如何将其用于枚举:Best way to implement Enums with Core Data(寻找我的答案)。

    【讨论】:

    • 是否可以在数据模型编辑器中定义这个?因为我有时会更新数据模型,然后让 CD 编辑器覆盖类......(我的意思是我可能会忘记用你的解决方案更新类)
    • 老实说,我从不使用代码生成器。只需自己输入@property 内容就可以了。也就是说,请注意这不是模型的一部分——模型保持不变。您只是对相同的值使用标量访问器。
    • 由于 Core Data 使用 NSNumber 而不是 int 的简单内容,例如添加 +1 (myVariable++) 变得更加复杂,即使使用新的文字 (myVariable = @34)。不过最后还是解决了,谢谢大家的帮助!
    • Eric Goldberg 提供了更多关于这里发生了什么的上下文,以及在生成 NSManagedObject 子类时如何让 Xcode 为您执行此操作。访问stackoverflow.com/questions/7044816/…
    【解决方案3】:

    在使用 Xcode 创建 NSManagedObject 文件时,您可以使用原始值生成属性。但是,您应该知道 NSNumber 是一个抽象类,运行时类类型将取决于用于创建 NSNumber 的值。

    【讨论】:

      猜你喜欢
      • 2014-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-10
      • 2014-11-18
      • 2014-08-09
      • 1970-01-01
      相关资源
      最近更新 更多