2014-10-31 2 views
1

Я реализовал индивидуальный чат с использованием инфраструктуры XMPP. Он имеет обширную поддержку в чате один к одному. Архивирование и выборка сообщений просты. Но я вижу, очень трудно справиться с сохранением и отображением сообщений в групповом чате. Сортировка и предикаты не работают. отображаются повторяющиеся сообщения.Как обрабатывать чат-сообщения MUC - дублирование сообщений

Это, как я присоединиться к комнате, прежде чем я принести мое уже сохраненное сообщение)

XMPPRoomCoreDataStorage *coreDataRoomStorage=[self appDelegate].xmppRoomCoreDataStorage; 
XMPPRoom *room=[[XMPPRoom alloc]initWithRoomStorage:coreDataRoomStorage jid:user.bareJid]; 
    [room activate:[self appDelegate].xmppStream]; 
    [room addDelegate:[self appDelegate] delegateQueue:dispatch_get_main_queue()]; 
    [room joinRoomUsingNickname:user.user_name history:nil]; 

Я вижу, есть несколько избыточного сохранения сообщений. Одно сообщение сохраняется 3-4 раза. Что я могу сделать неправильно. Помощь некоторых органов тела! Это код, я сделать для fecthing сообщений в комнате

- (NSFetchedResultsController *)fetchedResultsController{ 
if (fetchedResultsController == nil) 
{ 
    NSManagedObjectContext *moc = [[self appDelegate] managedObjectContext_message]; 

    NSEntityDescription *entity = [NSEntityDescription entityForName:@"XMPPMessageArchiving_Message_CoreDataObject" 
               inManagedObjectContext:moc]; 
    NSPredicate *predicate=[NSPredicate predicateWithFormat:@"bareJidStr=%@",_thisRoom.roomJID.bare]; 
    NSSortDescriptor *sd1 = [[NSSortDescriptor alloc] initWithKey:@"timestamp" ascending:YES]; 
    NSArray *sortDescriptors = [NSArray arrayWithObjects:sd1, nil]; 
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
    [fetchRequest setEntity:entity]; 
    [fetchRequest setSortDescriptors:sortDescriptors]; 
    [fetchRequest setPredicate:predicate]; 
    [fetchRequest setFetchBatchSize:20]; 
    fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest 
                    managedObjectContext:moc 
                    sectionNameKeyPath:nil 
                       cacheName:nil]; 
    [fetchedResultsController setDelegate:self]; 

    NSError *error = nil; 
    if (![fetchedResultsController performFetch:&error]) 
    { 
     DDLogError(@"Error performing fetch: %@", error); 
    } 
} 
return fetchedResultsController;} 
+0

Почему нисходящий канал? Вопрос является подлинным, и ответ на этот вопрос поможет любому, кто занимается групповым голосованием, использовать robbie hanson xmpp framework. В этих рамках есть проблема с теми же сообщениями, что и в 3-4 раза. если кто-то найдет какую-нибудь работу, это сэкономит –

+0

Не беспокойтесь, приятель. Счастливый. Теперь вы можете видеть свой вопрос без проголосовавшего. Я проголосовал за ваш вопрос.Просто потому, что я полностью согласен с тобой в вопросе Его подлинного вопроса. –

ответ

1

Я думаю, что я узнал ответ на вопрос дублирования сообщений. Главной проблемой было сообщение, которое я посылаю в комнату, было повторено в каждой комнате. Что я сделал, когда когда-либо отправлял сообщение, я хранил идентификатор deviceID как дочерний элемент для xmppmessage. При получении сообщения я проверяю дочерний элемент. Если идентификатор devce совпадает с его тем же сообщением, которое я отправляю ранее, и его уже в основной Data, поэтому отмените это сообщение.

- (void)sendMessageWithBody:(NSString *)messageBody 
{ 
if ([messageBody length] == 0) return; 

NSXMLElement *body = [NSXMLElement elementWithName:@"body" stringValue:messageBody]; 
XMPPMessage *message = [XMPPMessage message]; 
[message addChild:body]; 


//device id is used, so that the my message element will be unique 
NSString *uuidString=[UIDevice currentDevice].identifierForVendor.UUIDString; 
NSXMLElement *myMsgLogic=[NSXMLElement elementWithName:@"myMsgLogic" stringValue:uuidString]; 
[message addChild:myMsgLogic]; 

[self sendMessage:message]; 
} 

Затем на сообщение, получаемое в xmppstream. справиться с этим В XMPPRoomCoreDataStorage, есть метод, называемый

- (void)handleIncomingMessage:(XMPPMessage *)message room:(XMPPRoom *)room 

на это сделать сообщение сортировки логики. Не вставив весь код:

- (void)handleIncomingMessage:(XMPPMessage *)message room:(XMPPRoom *)room 
{ 
    XMPPLogTrace(); 

XMPPJID *myRoomJID = room.myRoomJID; 
XMPPJID *messageJID = [message from]; 


NSString *uuidString=[UIDevice currentDevice].identifierForVendor.UUIDString; 

NSString *messageLogic= [[message elementsForName:@"myMsgLogic"].firstObject stringValue]; 

if ([uuidString isEqualToString:messageLogic]) { 
    return; 
} 

//rest code is already there in the method 
} 
+0

Здравствуйте, @alin, я хочу спросить одно: как мы можем сохранить групповой чат в основных данных? Я не могу получить данные из основных данных, как мы можем получить для однорангового чата. –

+0

Сушиль. XMPPRoomMessageCoreDataStorageObject. Это объект для сообщений в комнате. Дайте правильные параметры для извлечения основных данных (например, комнатные джипы, потоки и т. Д.). Затем вы получите сообщения сохраненной комнаты. –

+0

Спасибо за ответ @ Alin, но для извлечения нам нужно активировать coreDataStorage в appDelegate. Как мы это делаем? Как активировать coreDataStorage? –

0

Другой способ сделать это создает NSPredicate:

Получить эхо-сообщения (это означает, что послал сообщение в комнате, а сервер XMPP получил что сообщение и вновь разослано всем (трансляция) обитатели комнаты с голым как [email protected])

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"NOT (messageStr CONTAINS[cd] %@)", [NSString stringWithFormat:@"from=\"%@\"",[xmpp sharedInstance].xmppStream.myJID.bare]]; 

Если вы хотите, чтобы показать сообщения, которые были отправлены вами ([email protected]), а затем изменить строку из по в

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"NOT (messageStr CONTAINS[cd] %@)", [NSString stringWithFormat:@"to=\"%@\"",[xmpp sharedInstance].xmppStream.myJID.bare]]; 

Таким образом, нет необходимости изменять структуру.

+0

Хороший моральный. Я пробовал это. Но при очень быстрых поставках сообщений сообщения повторялись. А также метод msgLogic может быть выполнен без какой-либо операции с базой данных. Итак, я выбрал этот метод. –

+0

@alinandrews вы получили решение? У меня такой же вопрос – Siten

1

После многократного поиска и тестирования у меня есть вывод для получения дублирующих сообщений для группы. XMPP работает лучше, но фактический вопрос был:

[room activate:[self appDelegate].xmppStream]; 

Когда мы когда-либо активно, что комната на самом деле добавляет слушателя. Так Активен только один раз.

Смежные вопросы