上一篇文章,我们讨论了调试和好友模块,这一篇,在引入了好友模块后,我们来说说好友列表的显示。

还记得在上一篇中,我们把自动拉去好友列表给关掉了,所以,我们选择在控制器的-(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--好友列表(五)的更多相关文章

  1. iOS开发Swift篇—(五)元组类型

    iOS开发Swift篇—(五)元组类型 一.元组类型介绍 1.什么是元组类型 元组类型由 N个 任意类型的数据组成(N >= 0),组成元组类型的数据可以称为“元素” 示例: let posit ...

  2. iOS开发之窥探UICollectionViewController(五) --一款炫酷的图片浏览组件

    本篇博客应该算的上CollectionView的高级应用了,从iOS开发之窥探UICollectionViewController(一)到今天的(五),可谓是由浅入深的窥探了一下UICollectio ...

  3. iOS 开发之模糊效果的五种实现

    前言 在iOS开发中我们经常会用到模糊效果使我们的界面更加美观,而iOS本身也提供了几种达到模糊效果的API,如:Core Image,使用Accelerate.Framework中的vImage A ...

  4. iOS开发那些事儿(五)Objective-C浅拷贝与深拷贝

    浅拷贝:copy操作出来的对象指针直接指向模板的地址.即两个对象公用一块内存地址 #import <Foundation/Foundation.h> int main(int argc, ...

  5. iOS开发ReactiveCocoa学习笔记(五)

    ReactiveCocoa常见操作方法介绍: demo地址:https://github.com/SummerHH/ReactiveCocoa.git filter ignore ignoreValu ...

  6. ios开发事件处理之:五:事件的响应

  7. 文顶顶iOS开发博客链接整理及部分项目源代码下载

    文顶顶iOS开发博客链接整理及部分项目源代码下载   网上的iOS开发的教程很多,但是像cnblogs博主文顶顶的博客这样内容图文并茂,代码齐全,示例经典,原理也有阐述,覆盖面宽广,自成系统的系列教程 ...

  8. 我的iOS开发系列博文

    之前目录性的总结了发表过的关于OC方面的文章,今天在目录性的总结一下有关iOS开发的文章.走过路过不要错过哦,今天的博文也全都是干货.写技术博客与大家交流一下思想也是不错的. 下面是我的技术博客中有关 ...

  9. 【iOS XMPP】使用XMPPFramewok(五):好友列表

    转自:http://www.cnblogs.com/dyingbleed/archive/2013/05/17/3082226.html 好友列表 好友列表,在 XMPP 中被称为 roster,花名 ...

随机推荐

  1. ElasticSearch和solr的差别

    Elasticsearch简介 Elasticsearch是一个实时分布式搜索和分析引擎.它让你以前所未有的速度处理大数据成为可能.它用于全文搜索.结构化搜索.分析以及将这三者混合使用:维基百科使用E ...

  2. Centos/linux下的JDK安装

    1.连接到centos的远程主机上 #你的用户名 ssh root@xxxxx 2.输入密码登录 3.最好将镜像改为阿里云的镜像 http://mirrors.aliyun.com/help/cent ...

  3. CentOS7上安装并配置Nginx、PHP、MySql

    一.Nginx 1.安装nginx yum install nginx 2.启动nginx systemctl start nginx 除了systemctl start nginx之外,常用的相关命 ...

  4. Django在form提交CSRF验证失败. 相应中断问题

    CSRF验证失败. 相应中断. 1).首先,我们可以先看一下出现问题的所在的原因. Your browser is accepting cookies. The view function passe ...

  5. Python 关于super 的 用法和原理(挖坑)

    一.前言 Python 面向对象中有继承这个概念,初学时感觉很牛逼,里面也有个super类,经常见到,最近做一些题才算是理解了.特地记录分享给后来研究的小伙伴,毕竟现在小学生都开始学了(滑稽脸) 二. ...

  6. 求指定区间内与n互素的数的个数 容斥原理

    题意:给定整数n和r,求区间[1, r]中与n互素的数的个数. 详细见容斥定理 详细代码如下 int solve(int r, int n) { vector<int>p; p.clear ...

  7. FZU - 2150 bfs [kuangbin带你飞]专题一

    题意:两个人玩很变态的游戏,将一个草坪的某两个点点燃,点燃的草坪可以向上下左右四个方向扩散,问能否将整块草坪上面的草都点燃.如果能,输出最短时间(^_^他们就能玩更变态的游戏了),如果不能,输出-1. ...

  8. python技巧

    python小技巧: 1.强烈建议使用Python的r前缀,就不用考虑转义的问题了. 2.正则表达式的使用: test = '用户输入的字符串' if re.match(r'正则表达式', test) ...

  9. caffe之路-SIGTERM信号捕捉

    Caffe在1.0版本仅支持两种信号的处理: 1) SIGHUP 2) SIGINT SIGHUP:caffe接收到此信号后进行snapshot,并不会中断caffe的训练. SIGINT:caffe ...

  10. 搬砖的也能学Python----if - elif 语句

    引入:如果平时执行的过程超过两个分支,则使用if-elif语句 if-elif 语句结构 if 判断条件: 要执行的代码 elif 判断条件: 要执行的代码 -- else: 要执行的代码 判断条件: ...