ios - 核心数据:NSManagedObjectContext 的 save() 方法需要一分钟多的时间来保存具有唯一约束的对象
问题描述
我有实体ChatMessage
,ChatUser
和ChatRoom
。
class ChatMessage: NSManagedObject {
@NSManaged var id: String // Unique constraint
@NSManaged var message: String
@NSManaged var user: ChatUser
@NSManaged var room: ChatRoom
}
class ChatUser: NSManagedObject {
@NSManaged var id: String // Unique constraint
@NSManaged var name: String
@NSManaged var messages: Set<ChatMessage>
}
class ChatRoom: NSManagedObject {
@NSManaged var id: String // Unique constraint
@NSManaged var name: String
@NSManaged var messages: Set<ChatMessage>
}
假设有 100ChatUser
秒和 100ChatRoom
秒,每个都包含至少 5000ChatMessage
秒。
ChatServer 使用同步策略,它可以传递重复的 ChatMessages,但它不会错过任何一个。因此,iOS 客户端应检查重复项。但幸运的是,它Core Data
有助于解决重复问题,无需任何额外的编程工作。unique key constraints
但是保存一个新文件需要一分钟多的时间ChatMessage
,Xcode
仪器表明该isEquals:
方法NSString
需要更多时间。原因是,Core Data
在 save() 期间检查唯一性。
如果我删除id
唯一约束一切正常,但我需要通过额外的代码工作来处理重复项。
我的错误是什么?还是核心数据问题?我花了几天时间来找出问题所在。处理这个问题的正确方法是什么?
提前致谢!
解决方案
由于 ChatUser.messages 属性是一个集合,并且一个集合只包含唯一值,您应该能够通过将所有消息添加到用户对象和它们所属的房间对象来利用它,并免费删除任何重复项。
推荐阅读
- php - 时间用完后刷新页面的Javascript
- r - 如何将.avl 后缀文件读入r?
- javascript - 如果无法加载,如何隐藏图像/视频
- pandas - 从数据框的文本列中删除不需要的字符
- android - MediaRecorder Surface Input with OpenGL - 如果启用了音频录制,则会出现问题
- python - 如何在不依赖列名的情况下操作数据框的值
- ios - 在 Flutter 中监听方向状态;旋转前后
- python - Assigning global attribute name using a parameter in netCDF4
- memory - 每个页面错误都有磁盘访问吗?
- apache-flink - 具有本地执行环境的 Flink 保存点(如独立应用程序)