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

时间:2018-07-24 11:57:03

标签: ios performance core-data unique-constraint

我那里有实体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>
}

我们假设有100个ChatUser和100个ChatRoom,每个都包含至少5000个ChatMessage s。

ChatServer与同步策略一起使用,它可以传递重复的ChatMessage,但它甚至不应丢失单个。因此,iOS客户端应检查重复项。但是幸运的是,Core Data促进了unique key constraints的发展,并且无需任何额外的编程工作即可解决重复的问题。

但是保存新的ChatMessageXcode仪器花费了超过一分钟的时间,这表明isEquals:中的NSString方法花费了更多时间。原因是Core Data在save()期间检查唯一性。

如果我删除了id唯一约束,那么一切都会很好,但是我需要花费更多的代码来处理重复项。

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

谢谢!

1 个答案:

答案 0 :(得分:0)

由于ChatUser.messages属性是一个集合,并且集合仅包含唯一值,因此您应该可以通过将所有消息添加到用户对象和它们所属的房间对象中并免费删除所有重复项来使用该值