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

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

}

你可能感兴趣的:(ios开发)