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="[email protected]" from="[email protected]"></presence>

来自[email protected]的,type为subscribe的订阅请求。

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

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

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

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

时间: 2024-11-07 19:11:37

iOS开发--XMPPFramework--好友列表(五)的相关文章

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

本篇博客应该算的上CollectionView的高级应用了,从iOS开发之窥探UICollectionViewController(一)到今天的(五),可谓是由浅入深的窥探了一下UICollectionView的用法,这些用法不仅包括SDK中自带的流式布局(UICollectionViewDelegateFlowLayout)而且介绍了如何根据你的需求去自定义属于你自己的CollectionView.自定义的CollectionView可谓是非常灵活,其灵活性也决定了其功能的强大.Collect

直播APP开发之iOS开发中的列表优化思路

APP开发中,列表可能是平时我们打交道最多的UI控件之一,其重要性不言而喻,对其性能的优化同样至关重要.而对于iOS开发,列表就是我们常说的UITableView / UICollectionView.在进行直播APP开发时针对于列表的优化自然是必不可少的.这里以UITableView为例简略介绍一下列表优化思路.(1) cell复用.这是每一个iOS开发者都非常熟悉的一部分内容.我们经常在cellForRowAtIndexPath:中为每一个cell绑定数据,实际上在调用cellForRowA

iOS-QQ好友列表 iOS 页面间几种传值方式(属性,代理,block,单例,通知)

主要是 点击按钮实现下拉 刷新数据 页面间传值 // // HMFriendsModel.h // QQ好友列表 // // Created by YaguangZhu on 15/9/1. // Copyright (c) 2015年 YaguangZhu. All rights reserved. // #import <Foundation/Foundation.h> @interface HMFriendsModel : NSObject @property(nonatomic,cop

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

浅拷贝:copy操作出来的对象指针直接指向模板的地址.即两个对象公用一块内存地址 1 #import <Foundation/Foundation.h> 2 int main(int argc, const char * argv[]) { 3 @autoreleasepool { 4 NSString * testStr = @"connor"; 5 NSLog(@"testStr's Address = %p",testStr); 6 7 NSStr

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

一.元组类型介绍 1.什么是元组类型 元组类型由 N个 任意类型的数据组成(N >= 0),组成元组类型的数据可以称为“元素” 示例: let position = (x : 10.5, y : 20)  // position有2个元素,x.y是元素的名称 let person = (name : "jack")  // person只有name一个元素 let data = ()  // 空的元组 2.元素的访问 var position = (x : 10.5, y : 2

ioS开发知识(十五)

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

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

文顶顶iOS开发博客链接整理及部分项目源代码下载 网上的iOS开发的教程很多,但是像cnblogs博主文顶顶的博客这样内容图文并茂,代码齐全,示例经典,原理也有阐述,覆盖面宽广,自成系统的系列教程却很难找.如果你是初学者,在学习了斯坦福iOS7公开课和跟着文顶顶的博客做项目之后,最快只需要2个月时间,就基本可以独立完成iOS App的开发工作.有经验的开发者也可以在该博客中寻找代码片段进行学习借鉴,必有所收获. 在此也向@文顶顶 表示严重感谢! 由于文顶顶博客博文繁多,每次找文章需要频繁的翻页,

iOS开发之窥探UICollectionViewController

iOS开发之窥探UICollectionViewController(一) -- Ready Your CollectionViewController 作者:青玉伏案 http://www.cnblogs.com/ludashi/p/4791826.html iOS开发之窥探UICollectionViewController(二) --详解CollectionView各种回调 作者:青玉伏案 http://www.cnblogs.com/ludashi/p/4792480.html iOS开