我有一个像这样的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 <-->> MessageMy 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; }更多推荐
发布评论