iOS开发--XMPPFramework--好友列表(五)
上一篇文章,我们讨论了调试和好友模块,这一篇,在引入了好友模块后,我们来说说好友列表的显示。
还记得在上一篇中,我们把自动拉去好友列表给关掉了,所以,我们选择在控制器的-(void)viewDidLoad;中手动拉取好友列表,并且添加代理。
[[XMPPManager sharedInstance].xmppRoster fetchRoster];
[[XMPPManager sharedInstance].xmppRoster addDelegate:self delegateQueue:dispatch_get_main_queue()];
[[XMPPManager sharedInstance].xmppStream addDelegate:self delegateQueue:dispatch_get_main_queue()];
// 好友同步结束
- (void)xmppRosterDidEndPopulating:(XMPPRoster *)sender {
NSLog(@"好友同步结束,查询数据库");
dispatch_async(dispatch_get_main_queue(), ^{
[self queryFriendList];
});
} // 查找到好友
- (void)xmppRoster:(XMPPRoster *)sender didReceiveRosterPush:(XMPPIQ *)iq {
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5f * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[self queryFriendList];
});
} #pragma mark XMPPStreamDelegate
- (void)xmppStream:(XMPPStream *)sender didReceivePresence:(XMPPPresence *)presence {
//这个if成立的时候说明对方拒绝或者删除了你
if ([presence.type isEqualToString:@"unsubscribed"]) {
[[XMPPManager sharedInstance].xmppRoster removeUser:presence.from];
}
}
手动拉取好友列表之后,会调取上面第一个代理方法,我们在这个方法里面在本地做一次好友查找。等服务器端收到好友列表后,会调用第二个代理方法,病将列表存入本地coredata中,所以,我们再从本地查找一次。
第三个代理方法,是收到presence消息后的调用。我们在里面处理收到好友请求被拒绝或者对方删除(即取消订阅),这边的操作是将好友remove掉。
接下来就是最重要的本地coredata查找功能,-(void)queryFriendList函数。
从coredata中查找数据分为三步,创建查找请求,定位实体,设置数据排序或筛选模式。这些代码并不需要我们写,苹果有个代码块可以供我们用。以下就是:

把这段代码拖到我们需要的地方就行。
- (void)queryFriendList {
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
XMPPRosterCoreDataStorage *storage = [XMPPRosterCoreDataStorage sharedInstance];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"XMPPUserCoreDataStorageObject" inManagedObjectContext:storage.mainThreadManagedObjectContext];
[fetchRequest setEntity:entity];
// Specify criteria for filtering which objects to fetch
// NSPredicate *predicate = [NSPredicate predicateWithFormat:@"subscription = 'both'"];
// [fetchRequest setPredicate:predicate];
// Specify how the fetched objects should be sorted
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"jidStr" ascending:YES];
[fetchRequest setSortDescriptors:[NSArray arrayWithObjects:sortDescriptor, nil]];
NSError *error = nil;
NSArray *fetchedObjects = [storage.mainThreadManagedObjectContext executeFetchRequest:fetchRequest error:&error];
if (fetchedObjects == nil) {
//
}
self.friendList = fetchedObjects;
[self.tableView reloadData];
}
拖完之后,修改些类名,排序和筛选方式,再做些个性化操作,就可以了。
这里需要注意的是,我们得到fetchedObjects这些结果之后,可以立刻转为我们需要的Model,用起来方便,数组中的每个对象,都是
XMPPUserCoreDataStorageObject对象,进入头文件中看,更加清楚。
接下来,我们调试一下。
运行程序。
先在“消息”应用中添加好友。

程序代理方法
- (void)xmppStream:(XMPPStream *)sender didReceivePresence:(XMPPPresence *)presence;
收到订阅请求。
<presence xmlns="jabber:client" type="subscribe" to="wangwu@im.zhenghm" from="zhangsan@im.zhenghm"></presence>
来自zhangsan@im.zhenghm的,type为subscribe的订阅请求。
我们在上一篇中讲过,收到后自动同意。我们切换到好友列表界面

成功!zhangsan已经存在我们的好友列表内~
这一篇我们讨论了好友列表,下一篇我们开始聊天的话题,下次见。
XMPP即时通讯交流群140147825,欢迎大家来交流~我们是一起写代码的弟兄~周末愉快~
iOS开发--XMPPFramework--好友列表(五)的更多相关文章
- iOS开发Swift篇—(五)元组类型
iOS开发Swift篇—(五)元组类型 一.元组类型介绍 1.什么是元组类型 元组类型由 N个 任意类型的数据组成(N >= 0),组成元组类型的数据可以称为“元素” 示例: let posit ...
- iOS开发之窥探UICollectionViewController(五) --一款炫酷的图片浏览组件
本篇博客应该算的上CollectionView的高级应用了,从iOS开发之窥探UICollectionViewController(一)到今天的(五),可谓是由浅入深的窥探了一下UICollectio ...
- iOS 开发之模糊效果的五种实现
前言 在iOS开发中我们经常会用到模糊效果使我们的界面更加美观,而iOS本身也提供了几种达到模糊效果的API,如:Core Image,使用Accelerate.Framework中的vImage A ...
- iOS开发那些事儿(五)Objective-C浅拷贝与深拷贝
浅拷贝:copy操作出来的对象指针直接指向模板的地址.即两个对象公用一块内存地址 #import <Foundation/Foundation.h> int main(int argc, ...
- iOS开发ReactiveCocoa学习笔记(五)
ReactiveCocoa常见操作方法介绍: demo地址:https://github.com/SummerHH/ReactiveCocoa.git filter ignore ignoreValu ...
- ios开发事件处理之:五:事件的响应
- 文顶顶iOS开发博客链接整理及部分项目源代码下载
文顶顶iOS开发博客链接整理及部分项目源代码下载 网上的iOS开发的教程很多,但是像cnblogs博主文顶顶的博客这样内容图文并茂,代码齐全,示例经典,原理也有阐述,覆盖面宽广,自成系统的系列教程 ...
- 我的iOS开发系列博文
之前目录性的总结了发表过的关于OC方面的文章,今天在目录性的总结一下有关iOS开发的文章.走过路过不要错过哦,今天的博文也全都是干货.写技术博客与大家交流一下思想也是不错的. 下面是我的技术博客中有关 ...
- 【iOS XMPP】使用XMPPFramewok(五):好友列表
转自:http://www.cnblogs.com/dyingbleed/archive/2013/05/17/3082226.html 好友列表 好友列表,在 XMPP 中被称为 roster,花名 ...
随机推荐
- ElasticSearch和solr的差别
Elasticsearch简介 Elasticsearch是一个实时分布式搜索和分析引擎.它让你以前所未有的速度处理大数据成为可能.它用于全文搜索.结构化搜索.分析以及将这三者混合使用:维基百科使用E ...
- Centos/linux下的JDK安装
1.连接到centos的远程主机上 #你的用户名 ssh root@xxxxx 2.输入密码登录 3.最好将镜像改为阿里云的镜像 http://mirrors.aliyun.com/help/cent ...
- CentOS7上安装并配置Nginx、PHP、MySql
一.Nginx 1.安装nginx yum install nginx 2.启动nginx systemctl start nginx 除了systemctl start nginx之外,常用的相关命 ...
- Django在form提交CSRF验证失败. 相应中断问题
CSRF验证失败. 相应中断. 1).首先,我们可以先看一下出现问题的所在的原因. Your browser is accepting cookies. The view function passe ...
- Python 关于super 的 用法和原理(挖坑)
一.前言 Python 面向对象中有继承这个概念,初学时感觉很牛逼,里面也有个super类,经常见到,最近做一些题才算是理解了.特地记录分享给后来研究的小伙伴,毕竟现在小学生都开始学了(滑稽脸) 二. ...
- 求指定区间内与n互素的数的个数 容斥原理
题意:给定整数n和r,求区间[1, r]中与n互素的数的个数. 详细见容斥定理 详细代码如下 int solve(int r, int n) { vector<int>p; p.clear ...
- FZU - 2150 bfs [kuangbin带你飞]专题一
题意:两个人玩很变态的游戏,将一个草坪的某两个点点燃,点燃的草坪可以向上下左右四个方向扩散,问能否将整块草坪上面的草都点燃.如果能,输出最短时间(^_^他们就能玩更变态的游戏了),如果不能,输出-1. ...
- python技巧
python小技巧: 1.强烈建议使用Python的r前缀,就不用考虑转义的问题了. 2.正则表达式的使用: test = '用户输入的字符串' if re.match(r'正则表达式', test) ...
- caffe之路-SIGTERM信号捕捉
Caffe在1.0版本仅支持两种信号的处理: 1) SIGHUP 2) SIGINT SIGHUP:caffe接收到此信号后进行snapshot,并不会中断caffe的训练. SIGINT:caffe ...
- 搬砖的也能学Python----if - elif 语句
引入:如果平时执行的过程超过两个分支,则使用if-elif语句 if-elif 语句结构 if 判断条件: 要执行的代码 elif 判断条件: 要执行的代码 -- else: 要执行的代码 判断条件: ...