任何一个信息的发送都需要关注两个部分,信息的发出,和信息在界面中的显示

往期回顾:

xmpp整理笔记:环境的快速配置(附安装包)  http://www.cnblogs.com/dsxniubility/p/4304570.html

xmpp整理笔记:xmppFramework框架的导入和介绍  http://www.cnblogs.com/dsxniubility/p/4307057.html

xmpp整理笔记:用户网络连接及好友管理http://www.cnblogs.com/dsxniubility/p/4307066.html

需要注意一点:

聊天界面输入框并不是textField而是textView,因为textView可以控制多行信息间的上下滚动编辑,如果微信下面的聊天框用的是普通的textField你可以想象会出现什么情况。

用模拟器程序和小鸭子聊天效果图如下:

如果你不是在董铂然博客园看到本文 请点击查看原文

一。信息的发送

首先要有一个结果调度器

这是通过coredata从SQLlite取数据的必要操作。所有代码写在这个懒加载中

- (NSFetchedResultsController *)fetchedResultsController {
// 推荐写法,减少嵌套的层次
if (_fetchedResultsController != nil) {
return _fetchedResultsController;
} // 先确定需要用到哪个实体
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"XMPPMessageArchiving_Message_CoreDataObject"]; // 排序
NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"timestamp" ascending:YES];
request.sortDescriptors = @[sort]; // 每一个聊天界面,只关心聊天对象的消息
request.predicate = [NSPredicate predicateWithFormat:@"bareJidStr = %@", self.chatJID.bare]; // 从自己写的工具类里的属性中得到上下文
NSManagedObjectContext *ctx = [SXXMPPTools sharedXMPPTools].xmppMessageArchivingCoreDataStorage.mainThreadManagedObjectContext; // 实例化,里面要填上上面的各种参数
_fetchedResultsController = [[NSFetchedResultsController alloc]
  initWithFetchRequest:request managedObjectContext:ctx sectionNameKeyPath:nil cacheName:nil];
_fetchedResultsController.delegate = self; return _fetchedResultsController;
}

写完了结果调度器之后要切记在viewdidload页面首次加载中加上一句,否则不干活

// 查询数据
[self.fetchedResultsController performFetch:NULL];

发送出消息

因为textView里面没有类似textField的shouldReturn的方法 直接发送信息

所以只能对textView的《代理方法之文本改变方法》 稍加处理达到文本发送的目的

#pragma mark - ******************** textView代理方法
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
{
// 判断按下的是不是回车键。
if ([text isEqualToString:@"\n"]) { // 自定义的信息发送方法,传入字符串直接发出去。
[self sendMessage:textView.text]; self.textView.text = nil; return NO;
}
return YES;
}

在输入时如果按下回车键那触发代理方法传入的这个字符就是"\n" 就会调用自己写的 这个sendMessage方法,传入一个字符串直接发出去。

这个方法内部把传入的文本先addBody 再用自己手写的单例类的xmpp流 发出去。

#pragma mark - ******************** 发送消息方法
/** 发送信息 */
- (void)sendMessage:(NSString *)message
{
XMPPMessage *msg = [XMPPMessage messageWithType:@"chat" to:self.chatJID]; [msg addBody:message]; [[SXXMPPTools sharedXMPPTools].xmppStream sendElement:msg];
}

二。信息在tableView中的显示

是在tableView的数据源方法中,先从数据库中取出当前的信息,再判断是发出去的还是接收的。取到不同的可重用标识符,然后赋值

    // 取出当前行的消息
XMPPMessageArchiving_Message_CoreDataObject *message = [self.fetchedResultsController objectAtIndexPath:indexPath];
// 判断是发出消息还是接收消息
NSString *ID = ([message.outgoing intValue] == 1) ? @"SendCell" : @"ReciveCell" ;
SXChatCell *cell = [tableview dequeueReusableCellWithIdentifier:ID];
cell.messageLabel.text = message.body;

其中sx开的的类名都是我自定义的类,里面都是常规写法。

关于上面提到的工具类SXXmppTools里 这个模块需要用到得属性和方法有

/** xmpp流 */
@property(nonatomic,strong,readonly) XMPPStream * xmppStream;
/** 消息归档 */
@property (nonatomic, strong, readonly) XMPPMessageArchiving *xmppMessageArchiving;
/** 消息归档存储 */
@property (nonatomic, strong, readonly) XMPPMessageArchivingCoreDataStorage *xmppMessageArchivingCoreDataStorage; + (instancetype)sharedXMPPTools;

这里有一点需要注意,

因为默认情况下你一进入一位好友的聊天页面,你和所有好友的聊天记录都会显示。因为都是存在同一个数据表里的啊,因此需要做一层过滤,就是懒加载中的这行代码

// 每一个聊天界面,只关心聊天对象的消息
request.predicate = [NSPredicate predicateWithFormat:@"bareJidStr = %@", self.chatJID.bare];

如果你不是在董铂然博客园看到本文 请点击查看原文

正在整理音频文件和图片文件的发送方法,有兴趣的可以关注我。

xmpp整理笔记:聊天信息的发送与显示的更多相关文章

  1. xmpp整理笔记:发送图片信息和声音信息

    图片和音频文件发送的基本思路就是: 先将图片转化成二进制文件,然后将二进制文件进行base64编码,编码后成字符串.在即将发送的message内添加一个子节点,节点的stringValue(节点的值) ...

  2. xmpp整理笔记:用户网络连接及好友的管理

    xmpp中的用户连接模块包括用户的上线与下线信息展现,用户登录,用户的注册: 好友模块包括好友的添加,好友的删除,好友列表的展示. 在xmpp中 负责数据传输的类是xmppStream,开发的过程中, ...

  3. xmpp整理笔记:xmppFramework框架的导入和介绍

    一个将要开发xmpp的项目,建议在项目刚创建就导入框架,这样可以避免一些自己操作失误造成不必要的损失. xmpp中最常用的框架就是 xmppFrameWork 往期回顾: xmpp整理笔记:环境的快速 ...

  4. xmpp整理笔记:环境的快速配置(附安装包)

    现在虽然环信的xmpp框架很火,但是也有一些弊端.环信的框架部分代码不开源,而且收费模式不科学,用户量一直低于免费线则好,一旦超过,收费极高. xmpp感觉还是从xmppFramework框架学起比较 ...

  5. sk_buff整理笔记(两、操作函数)

    承接上一:sk_buff 整理笔记(一.数据结构)这一篇要讲的是内核为sk_buff结构提供的一些操作函数. 第一.首先要讲的是sk_buff中的四大指针: 四大指针各自是:head.data.tai ...

  6. element-ui Carousel 走马灯源码分析整理笔记(十一)

    Carousel 走马灯源码分析整理笔记,这篇写的不详细,后面有空补充 main.vue <template> <!--走马灯的最外层包裹div--> <div clas ...

  7. jQuery整理笔记七----几个经典表单应用

    1.文本框获得(失去)焦点 当文本框获得输入焦点时,将该文本框高亮显示,算不得一个应用,仅仅是一个小技巧,能够提高用户体验. <!DOCTYPE html PUBLIC "-//W3C ...

  8. canvas学习之API整理笔记(二)

    前面我整理过一篇文章canvas学习之API整理笔记(一),从这篇文章我们已经可以基本了解到常用绘图的API.简单的变换和动画.而本篇文章的主要内容包括高级动画.像素操作.性能优化等知识点,讲解每个知 ...

  9. jQuery整理笔记文件夹

    jQuery整理笔记文件夹 jQuery整理笔记一----jQuery開始 jQuery整理笔记二----jQuery选择器整理 jQuery整理笔记三----jQuery过滤函数 jQuery整理笔 ...

随机推荐

  1. 判断js数据类型和clone

    判断返回js数据类型 function judgeType(arg){//判断返回js数据类型 return Object.prototype.toString.call(arg).slice(8,- ...

  2. C#中string.format的格式和用法

    String.Format 方法的几种定义: String.Format (String, Object) 将指定的 String 中的格式项替换为指定的 Object 实例的值的文本等效项. Str ...

  3. mysql判断一条记录是否存在,如果存在,则更新此语句,如果不存在,则插入

    前言,在我们的业务逻辑中,很有可能会遇到这样的情况. 1.我要更新一条记录的值. 2.但是我不确定这条记录存不存在??? 3.那如果存在?我就更新,如果不存在,我就插入! 那么如果这样,一般情况下,我 ...

  4. Android反编译(三)之重签名

    Android反编译(三) 之重签名 [目录] 1.原理 2.工具与准备工作 3.操作步骤 4.装X技巧 5.问题 1.原理 1).APK签名的要点 a.所有的应用程序都必须有数字证书 ,Androi ...

  5. 使用redis和fastjson做应用和mysql之间的缓存

    第一次做这种javaweb的项目,难免还是要犯很多错误. 大概也知道,redis常常被用来做应用和mysql之间的缓存.模型大概是这样子的. 为了让redis能够缓存mysql数据库中的数据,我写了很 ...

  6. JS魔法堂: Native Promise Only源码剖析

    一, 前言 深入学习Promise的朋友应该都看过<深入理解Promise五部曲>这一系列的文章, 以解除回调地狱之外的观点来剖析Promise更多的内涵,确实十分精彩. Part 1: ...

  7. 我们一起来动手开发一个Orm框架,开源发布

    我们追求的方向 1)高性能. 这也是架构创建的目的之一,已经将它的性能提升到了极致.大家可以自己测试.我可以说其性能是数一数二的.连接地址:Moon洗冤录 2)易用性强 我想,用过Moon.ORM的应 ...

  8. 矩阵乘法 --- hdu 4920 : Matrix multiplication

    Matrix multiplication Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/ ...

  9. [Android] 环境配置之正式版Android Studio 1.0

    昨天看见 Android Studio 1.0 正式版本发布了:心里挺高兴的. 算是忠实用户了吧,从去年开发者大会一开始出现 AS 后就开始使用了:也是从那时开始就基本没有用过 Eclipse 了:一 ...

  10. App单个页面的最佳文本框个数是多少个?

    [1].不同大小的手机屏幕,对应的App每页最佳文本框个数,是不同的. [1.1]如果是iPhone4的屏幕尺寸,分辨率为640x960px的时候, 文本框个数最大值为:2个文本框 [计算公式] 第 ...