首页 > 解决方案 > 核心数据:NSManagedObjectContext 的 save() 方法需要一分钟多的时间来保存具有唯一约束的对象

问题描述

我有实体ChatMessageChatUserChatRoom

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

但是保存一个新文件需要一分钟多的时间ChatMessageXcode仪器表明该isEquals:方法NSString需要更多时间。原因是,Core Data在 save() 期间检查唯一性。

如果我删除id唯一约束一切正常,但我需要通过额外的代码工作来处理重复项。

我的错误是什么?还是核心数据问题?我花了几天时间来找出问题所在。处理这个问题的正确方法是什么?

提前致谢!

标签: iosperformancecore-dataunique-constraint

解决方案


由于 ChatUser.messages 属性是一个集合,并且一个集合只包含唯一值,您应该能够通过将所有消息添加到用户对象和它们所属的房间对象来利用它,并免费删除任何重复项。


推荐阅读