具有相同值的NSManagedObjects的CoreData NSSet

编程入门 行业动态 更新时间:2024-10-10 10:32:53
具有相同值的NSManagedObjects的CoreData NSSet-Like行为(CoreData NSSet-Like behavior for NSManagedObjects with the same values)

我有一个像这样的Data-Modell的Chat-App。

User <--> Conversation <-->> Message

我现在的问题:有时候,如果我从备份中获取旧消息,我的DataModel中会有两次消息。 我希望有一个NSSet-Like类,如果Message-Object的属性值完全相同,则可以识别它。 我读过,我不能覆盖方法-hash和-isEqual: ,所以我不知道该怎么做。 任何想法? 这是一些代码......

+(void)addMessages:(NSSet<JSQMessage *> *)messages toConversation:(Conversation *)conversation { DataManager * dataManager = [DataManager dataManager]; NSMutableSet * storeSet = [NSMutableSet setWithCapacity:messages.count]; for (JSQMessage * jsqMessage in messages) { Message * message = [NSEntityDescription insertNewObjectForEntityForName:CDEntityNameMessage inManagedObjectContext:[dataManager managedObjectContext]]; message.senderId = jsqMessage.senderId; message.senderDisplayName = jsqMessage.senderDisplayName; message.text = jsqMessage.text; message.date = jsqMessage.date; [storeSet addObject:message]; } [conversation addMessages:storeSet]; NSError *error; if (![[dataManager managedObjectContext] save:&error]) { NSLog(@"Something went wrong: %@", [error localizedDescription]); } else { //Saved successfull } }

Conversation -addMessages: Method是从Xcode / CoreData自动生成的方法

- (void)addMessages:(NSSet<Message *> *)values;

I have a Chat-App with a Data-Modell like this.

User <--> Conversation <-->> Message

My Problem now: Sometimes, if I get old messages from a Backup, I have Messages twice in my DataModel. I'd like to have a NSSet-Like Class which recognizes, if a Message-Object has exactly the same values on it's properties. I've read, that I must not override the methods -hash and -isEqual:, so I don't know how to do it. Any Idea? Here is some code...

+(void)addMessages:(NSSet<JSQMessage *> *)messages toConversation:(Conversation *)conversation { DataManager * dataManager = [DataManager dataManager]; NSMutableSet * storeSet = [NSMutableSet setWithCapacity:messages.count]; for (JSQMessage * jsqMessage in messages) { Message * message = [NSEntityDescription insertNewObjectForEntityForName:CDEntityNameMessage inManagedObjectContext:[dataManager managedObjectContext]]; message.senderId = jsqMessage.senderId; message.senderDisplayName = jsqMessage.senderDisplayName; message.text = jsqMessage.text; message.date = jsqMessage.date; [storeSet addObject:message]; } [conversation addMessages:storeSet]; NSError *error; if (![[dataManager managedObjectContext] save:&error]) { NSLog(@"Something went wrong: %@", [error localizedDescription]); } else { //Saved successfull } }

And the Conversation -addMessages: Method is the one automatically generated from Xcode/CoreData

- (void)addMessages:(NSSet<Message *> *)values;

最满意答案

一种方法是在实体上为一个或多个属性添加唯一约束。 但是,这个功能是从iOS 9添加的。这是WWDC视频的链接解释它: https : //developer.apple.com/videos/play/wwdc2015/220/

作为最后一个选项,如果符合您的逻辑和要求,您可以始终覆盖哈希和相等。

你的哈希方法看起来像这样:

- (NSUInteger)hash { NSInteger hashResult = 0; for (NSObject *ob in self) { hashResult ^= [ob hash]; } }

这不是哈希函数的最佳实现。 看看这个答案: https : //stackoverflow.com/a/5915445/2696922

对于isEqual方法,它可能看起来像:

- (BOOL)isEqual:(id)object { if (self == object) { return YES; } if (object == nil || ![object isKindOfClass:[JSQMessage class]]) { return NO; } JSQMessage *jsqMessage = (JSQMessage*)object; //You can have more parameters here based on your business logic if (self.message != jsqMessage.message && self.date != jsqMessage.date) { return NO; } }

What I do now is checking manually, if there is a Object with same Attributes in my MOC. If there is one, I skip the creation. I know, it is a bit inefficient but with my expected number of messages, this should be no problem.

NSFetchRequest * fr = [NSFetchRequest fetchRequestWithEntityName:CDEntityNameMessage]; [fr setPredicate:[NSPredicate predicateWithFormat:@"text == %@ AND date == %@ AND conversation.user.objectId == %@", message.text, message.date, chatpartner.objectId]]; NSArray * results = [[self managedObjectContext] executeFetchRequest:fr error:nil]; if (results && results.count > 0) { continue; }

更多推荐

本文发布于:2023-08-03 22:47:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1401292.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:NSManagedObjects   CoreData   NSSet

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!