博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS开发--XMPPFramework--好友列表(五)
阅读量:4983 次
发布时间:2019-06-12

本文共 2981 字,大约阅读时间需要 9 分钟。

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

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

收到订阅请求。

来自zhangsan@im.zhenghm的,type为subscribe的订阅请求。

我们在上一篇中讲过,收到后自动同意。我们切换到好友列表界面

成功!zhangsan已经存在我们的好友列表内~

这一篇我们讨论了好友列表,下一篇我们开始聊天的话题,下次见。

 

XMPP即时通讯交流群140147825,欢迎大家来交流~我们是一起写代码的弟兄~周末愉快~

转载于:https://www.cnblogs.com/FrankieZ/p/5292793.html

你可能感兴趣的文章
//停止关联的进程
查看>>
SQL 生成公曆和農曆對照數據,公曆查找農曆和農曆查找公曆函數
查看>>
为何场效应管要用UGD与UGS(off)来比较判断夹断情况?
查看>>
.pem证书转xml格式字符串(.net)
查看>>
js构建ui的统一异常处理方案(二)
查看>>
三线程连续打印ABC
查看>>
ECharts
查看>>
初识网络爬虫
查看>>
git push 时不用每次都输入密码的方法
查看>>
54点提高PHP编程效率 引入缓存机制提升性能
查看>>
编解码-marshalling
查看>>
CDN原理
查看>>
java.lang.outofmemoryerror android
查看>>
coding
查看>>
省市联级(DataReader绑定)
查看>>
20165219 课上内容补做
查看>>
Tomcat7.0与Oracle10数据库连接池配置
查看>>
解决webpack和gulp打包js时ES6转译ES5时Object.assign()方法没转译成功的问题
查看>>
字节流与字符流的区别详解(转)
查看>>
类操作数据库
查看>>