XMPP协议获取花名册(好友列表)

首先导入花名册模块,理由同上篇文章,这里不再具体说明

// 花名册模块
#import "XMPPRoster.h"
#import "XMPPRosterCoreDataStorage.h"


初始化花名册模块,并激活
//设置花名册模块
        self.rosterStorage=[[XMPPRosterCoreDataStorage alloc]init];
        self.roster=[[XMPPRoster alloc]initWithRosterStorage:self.rosterStorage];
        [self.roster activate:self.stream];

花名册模块也是先从服务器获取在存到本地数据库,再从本地数据库获取利用CoreData花名册存在XMPPUserCoreDataStorageObject表中,CordData有个很强大的类是

NSFetchedResultsController,他可以监听数据值的变化,如果设置代理了一但变化就会通知代理,这时候当一个用户的在线状态发生变化时刷新表格即可,免得用kvo监听属性比较麻烦<当切换登录用户时会把数据库里的好友数据删除,在把新的当前用户的好友数据加到数据库>

XMPPTool *tool=[XMPPTool sharedXMPPTool];
    NSManagedObjectContext *context=tool.rosterStorage.mainThreadManagedObjectContext;
    NSFetchRequest *request=[[NSFetchRequest alloc]initWithEntityName:@"XMPPUserCoreDataStorageObject"];
    //对结果进行排序
    NSSortDescriptor *sort=[NSSortDescriptor sortDescriptorWithKey:@"displayName" ascending:YES];
    request.sortDescriptors=@[sort];
    //设置谓词过滤
    NSPredicate *pre=[NSPredicate predicateWithFormat:@"subscription!=%@",@"none"];
    request.predicate=pre;//此处是设置过滤,none为加好友请求没有同意的好友
    self.resultController=[[NSFetchedResultsController alloc]initWithFetchRequest:request managedObjectContext:context sectionNameKeyPath:nil cacheName:nil];
    //设置代理
    self.resultController.delegate=self;
    NSError *error=nil;
    //执行
    [self.resultController performFetch:&error];
    if (error) {
        LSLog(@"出错:%@",error);
    }

取出表中每一行数据,即一个好友用户信息,user.photo为nil,所以每个好友头像都得自己利用头像模块获取

XMPPUserCoreDataStorageObject *user=self.resultController.fetchedObjects[indexPath.row];
    if (user.photo) {
        cell.imageView.image=user.photo;
    }else {
        XMPPTool *tool=[XMPPTool sharedXMPPTool];
        cell.imageView.image= [UIImage imageWithData:[tool.avatar photoDataForJID:user.jid]];
    
    }
    cell.textLabel.text=user.nickname;
    switch (user.sectionNum.intValue) {
        case 0:
            cell.detailTextLabel.text=@"在线";
            break;
            
        case 1:
            cell.detailTextLabel.text=@"离开";
            break;
        case 2:
            cell.detailTextLabel.text=@"离线";
            break;
            
        default:
            cell.detailTextLabel.text=@"未知";
            break;
    }


NSFetchedResultsController代理方法实现,数据改变刷新表格

-(void)controllerDidChangeContent:(NSFetchedResultsController *)controller
{
    [self.tableView reloadData];
}


删除好友,利用花名册模块删除

        XMPPTool *tool=[XMPPTool sharedXMPPTool];
        XMPPUserCoreDataStorageObject *user=self.resultController.fetchedObjects[indexPath.row];
        [tool.roster removeUser:user.jid];

加好友,首先利用花名测存储模块判断是否存在当前要添加用户

if (self.contactTextField.text==nil) {
        [KVNProgress showErrorWithStatus:@"请输入用户名"];
        return;
    }
    if ([self.contactTextField.text isEqualToString:[LSAccount sharedAccount].loginName]) {
        [KVNProgress showErrorWithStatus:@"不能添加自己"];
        return;
    }
    XMPPTool *tool=[XMPPTool sharedXMPPTool];
    NSString *user=self.contactTextField.text;
    XMPPJID *userJid=[XMPPJID jidWithUser:user domain:[LSAccount sharedAccount].domain resource:@"iPhone6s"];
    if ([tool.rosterStorage  userExistsWithJID:userJid  xmppStream:tool.stream]){
        [KVNProgress showErrorWithStatus:@"此好友已经存在"];
    }else {//在XMPP里订阅即是添加
        [tool.roster subscribePresenceToUser:userJid];
    }
    /*添加好友在现有openfire存在的问题
     1.添加不存在的好友,通讯录里面也现示了好友
     解决办法1. 服务器可以拦截好友添加的请求,如当前数据库没有好友,不要返回信息
     <presence type="subscribe" to="werqqrwe@127.0.0.1"><x xmlns="vcard-temp:x:update"><photo>b5448c463bc4ea8dae9e0fe65179e1d827c740d0</photo></x></presence>
     
     解决办法2.过滤数据库的Subscription字段查询请求
     none 对方没有同意添加好友
     to 发给对方的请求
     from 别人发来的请求
     both 双方互为好友
     
     */



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值