您的位置:首页 > 移动开发 > IOS开发

iOS开发:xmpp中是如何跟服务器进行联系的?

2016-05-07 09:16 525 查看
xmpp中是如何跟服务器进行联系的?

第一步:通过各种模块从服务器获取数据。比如电子名片模块,头像模块,花名册模块,消息模块等。

第二步:修改的数据需要同步到服务器,自己定义的方法,当点击保存按钮时就调用如下方法。

#pragma mark 点击按钮进行服务器更新。
-(void)editVCardViewController:(WCEditVCardViewController *)editVc didFinishedSave:(id)sender{
WCLog(@"完成保存");

//获取当前电子名片
XMPPvCardTemp *myVCard = [WCXMPPTool sharedWCXMPPTool].vCard.myvCardTemp;

//重新设置头像
myVCard.photo = UIImageJPEGRepresentation(self.avatarImgView.image, 0.75);

//重新设置myVCard里的属性
myVCard.nickname = self.nicknameLabel.text;
myVCard.orgName = self.orgNameLabel.text;

if (self.departmentLabel.text != nil) {
myVCard.orgUnits = @[self.departmentLabel.text];
}

myVCard.title = self.telLabel.text;
myVCard.note = self.telLabel.text;

//解析邮箱
//myVCard.mailer = self.emailLabel.text;
if (self.emailLabel.text.length > 0) {
// 只保存一个邮箱
myVCard.emailAddresses = @[self.emailLabel.text];
}

//把数据保存到服务器
// 内部实现数据上传是把整个电子名片数据都从新上传了一次,包括图片
[[WCXMPPTool sharedWCXMPPTool].vCard updateMyvCardTemp:myVCard];

}


第三步:服务器的内容更新后要通知客户端进行刷新。

方法一:不通过服务器,将修改的内容直接显示到客户端。比如电子名片的修改。

方法二:通过服务器,当服务器存储的内容发生改变时,xmpp框架会更新本地的数据库内容,并且xmpp有个代理方法,当服务器内容发生改变就会回调该方法,可以在这个方法里进行操作从数据库重新获取内容,比如花名册和聊天消息的更改。如下:

//获取需要的数据库
-(void)loadUsers2{
//显示好友数据 (保存XMPPRoster.sqlite文件)

//1.上下文 关联XMPPRoster.sqlite文件
NSManagedObjectContext *rosterContext = [WCXMPPTool sharedWCXMPPTool].rosterStorage.mainThreadManagedObjectContext;

//2.Request 请求查询哪张表
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"XMPPUserCoreDataStorageObject"];

//设置排序
NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"displayName" ascending:YES];
request.sortDescriptors = @[sort];

//过滤
NSPredicate *pre = [NSPredicate predicateWithFormat:@"subscription != %@",@"none"];
request.predicate = pre;

//3.执行请求
//3.1创建结果控制器
// 数据库查询,如果数据很多,会放在子线程查询
// 移动客户端的数据库里数据不会很多,所以很多数据库的查询操作都主线程
_resultsContr = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:rosterContext sectionNameKeyPath:nil cacheName:nil];
_resultsContr.delegate = self;
NSError *err = nil;
//3.2执行
[_resultsContr performFetch:&err];

WCLog(@"%@",_resultsContr.fetchedObjects);
}


//获取数据库的内容并显示
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
static NSString *ID = @"ContactCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];

//获取对应的好友
//XMPPUserCoreDataStorageObject *user = self.users[indexPath.row];
XMPPUserCoreDataStorageObject *user = _resultsContr.fetchedObjects[indexPath.row];
//标识用户是否在线
// 0:在线 1:离开 2:离线
WCLog(@"%@:在线状态%@",user.displayName,user.sectionNum);
cell.textLabel.text = user.displayName;
// 1.通过KVO来监听用户状态的改变
//[user addObserver:self forKeyPath:@"sectionNum" options:NSKeyValueObservingOptionNew context:nil];

switch ([user.sectionNum integerValue]) {
case 0:
cell.detailTextLabel.text = @"在线";
break;
case 1:
cell.detailTextLabel.text = @"离开";
break;
case 2:
cell.detailTextLabel.text = @"离线";
break;
default:
cell.detailTextLabel.text = @"见鬼了";
break;
}

//显示好友的头像
if (user.photo) {//默认的情况,不是程序一启动就有头像
cell.imageView.image = user.photo;
}else{
//从服务器获取头像
NSData *imgData = [[WCXMPPTool sharedWCXMPPTool].avatar photoDataForJID:user.jid];
cell.imageView.image = [UIImage imageWithData:imgData];
}

return cell;

}


#pragma mark -结果控制器的代理
#pragma mark -数据库内容改变调用该方法
-(void)controllerDidChangeContent:(NSFetchedResultsController *)controller{
WCLog(@"%@",[NSThread currentThread]);
//刷新表格
[self.tableView reloadData];

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: