在核心数据中保存和加载 xmpp 消息

Posted

技术标签:

【中文标题】在核心数据中保存和加载 xmpp 消息【英文标题】:Save and load xmpp messages in core data 【发布时间】:2014-03-04 14:06:51 【问题描述】:

我正在制作聊天应用程序,我想保存到核心数据用户个人资料(图像、姓名、年龄、详细信息),并与其他用户交谈。需要保存所有新消息,我需要我可以看到消息已被阅读,如果用户想要查看他的历史记录,我将从网络服务加载它(比如滚动到 VC 顶部)。

我使用该代码保存和加载消息,但如何使用我的结果数组为 2 个确切用户构建聊天历史记录?

//this code in XMPPStream
 xmppStream = [[XMPPStream alloc]init];
[xmppStream addDelegate:self delegateQueue:dispatch_get_main_queue()];
 xmppStream.autoStartTLS = YES;

 xmppReconnect = [[XMPPReconnect alloc]init];
[xmppReconnect activate:self.xmppStream];

 xmppMessageArchivingCoreDataStorage = [XMPPMessageArchivingCoreDataStorage sharedInstance];
 xmppMessageArchivingModule = [[XMPPMessageArchiving alloc]initWithMessageArchivingStorage:xmppMessageArchivingCoreDataStorage];
[xmppMessageArchivingModule setClientSideMessageArchivingOnly:YES];
[xmppMessageArchivingModule activate:xmppStream];    //By this line all your messages are stored in CoreData
[xmppMessageArchivingModule addDelegate:self delegateQueue:dispatch_get_main_queue()];

在talks VC中检索保存的消息

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];

 NSManagedObjectContext *context = [self.xmppMessageArchivingCoreDataStorage mainThreadManagedObjectContext];
 NSEntityDescription *messageEntity = [NSEntityDescription entityForName:@"XMPPMessageArchiving_Message_CoreDataObject" inManagedObjectContext:context];

 fetchRequest.entity = messageEntity;

 NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"timestamp" ascending:NO];
 fetchRequest.sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
 NSError *error = nil;
 NSArray *results = [context executeFetchRequest:fetchRequest error:&error];
//Now I get the NSArray with element type of "XMPPMessageArchiving_Message_CoreDataObject"

【问题讨论】:

给我们看一些代码 :) 你试过什么例子? @marcio,我更新了我的帖子,我需要结果数组包含 2 个开始聊天的用户的消息、日期、图像、用户名,但不是 那么你已经创建了你的数据模型了吗?添加实体?处理下载的数据并保存到数据存储中?获取请求返回结果?你有多远,更具体地说明什么不起作用。 @Wain,我想我只是添加了这段代码,我下载数据并在结果数组中接收它,但是对于任何 2 个聊天用户,我都有相同的数据。 我不知道如何使用该数组为 2 个确切用户构建聊天记录 【参考方案1】:

如果有人仍然需要答案:

只需将此谓词添加到您的请求中即可。

fetchRequest.predicate = [NSPredicate predicateWithFormat:@"bareJidStr = %@", user.jid];

【讨论】:

以上是关于在核心数据中保存和加载 xmpp 消息的主要内容,如果未能解决你的问题,请参考以下文章

在页面卸载 strophe.js 发送请求两次!为啥?

xmpp在android应用程序中发送和接收消息

如何在 ejabberd 中的 xmpp 消息正文中附加自定义数据

通过 XMPP 从 myapplication 推送消息

在线程中保存核心数据

如何在 android 中编辑和删除 XMPP 中的特定消息?