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

来源:互联网 发布:科比季后赛平均数据 编辑:程序博客网 时间:2024/05/01 11:18

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

// 花名册模块#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 0
原创粉丝点击