2014-10-31 6 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 번 저장됩니다. 나는 무엇을 잘못하고 있을지 모른다. 일부 신체 pls 도움이! 이것은 내가 방에서 메시지를 fecting하기위한 코드입니다.

- (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

왜 downvoted? 질문은 정품이며이 질문에 대한 답변은 robbie hanson xmpp 프레임 워크를 사용하여 그룹 채팅을하는 모든 사용자에게 도움이 될 것입니다. 이 프레임 워크에서 3-4 번 반복 된 동일한 메시지 문제가 있습니다. 누군가 주변에서 어떤 일을 발견하면 저축 할 것입니다. –

+0

친구를 걱정하지 마십시오. 행복해집니다. 투표 결과 없음을 볼 수 있습니다. 질문에 투표했습니다.나는 당신이 그 진정한 질문에 완전히 동의하기 때문에. –

답변

1

나는 메시지 중복 문제에 대한 답을 발견했다고 생각합니다. 주요 이슈는 내가 방에 보내는 메시지가 각 방에 반복적으로 참여한다는 것이 었습니다. 내가 한 일은 xmppmessage에 대한 자식 요소로 deviceID를 보관 한 메시지를 보내는 순간이었습니다. 메시지를 받으면 자식 요소를 확인합니다. devce id가 일치하면 이전에 보낸 동일한 메시지와 이미 핵심 데이터에있는 메시지와 마찬가지로 메시지를 버립니다.

- (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

Hello @alin, 한 가지 물어보고 싶은게 있습니다. 핵심 데이터에 그룹 채팅을 저장하는 방법은 무엇입니까? 피어 - 피어 채팅을 검색 할 수있는 것처럼 핵심 데이터에서 데이터를 검색 할 수 없습니다. –

+0

수실. XMPPRoomMessageCoreDataStorageObject. 이것은 방 메시지의 대상입니다. 핵심 데이터 가져 오기 (예 : room jids, stream etc)에 대한 올바른 매개 변수를 제공합니다. 그러면 저장된 객실 메시지가 표시됩니다. –

+0

답장 @ Alin을 주셔서 감사합니다. 그러나 검색하려면 appDelegate에서 coreDataStorage를 활성화해야합니다. 우리가 어떻게하는거야? 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]; 

을 우리가 활동하는 공간이 실제로 청취자를 추가 이제까지합니다. 따라서 한 번만 활성화.