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]; }