基于XMPP开发学习------(3)好友列表、发送消息

来源:互联网 发布:3d游戏美工 编辑:程序博客网 时间:2024/06/01 10:39

一、花名册

添加《花名册模块》在WCXMPPTool这个单例类中。

//花名册数据存储模块
@property(nonatomic, strong, readonly)XMPPRosterCoreDataStorage *rosterStorage;
//花名册模块
@property(nonatomic, strong, readonly)XMPPRoster *roster;

添加完模块后。在运行时,系统会自动加信息到数据库,只需要知道去哪个表查找就行。

#pragma mark 方法2
-(void)loadFriends2{
    
    /*使用coredata获取数据*/
    //1.上下文[xmpproster.sqlite]
    NSManagedObjectContext *context  = [WCXMPPTool sharedWCXMPPTool].rosterStorage.mainThreadManagedObjectContext;


    //2.fetchrequest[查哪个表]
    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"XMPPUserCoreDataStorageObject"];


    //3.设置过滤 排序
    NSString *jid = [WCUserInfo sharedWCUserInfo].jid;
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"streamBareJidStr = %@",jid];
    request.predicate = predicate;
    
    NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"displayName" ascending:YES];
    request.sortDescriptors = @[sort];
    //4.执行请求获取数据
    _resultController = [[NSFetchedResultsController alloc]initWithFetchRequest:request managedObjectContext:context sectionNameKeyPath:nil cacheName:nil];
    _resultController.delegate = self;
    
    NSError *err = nil;
    [_resultController performFetch:&err];
    if (err) {
        WCLog(@"%@",err);
    }
}
#pragma mark NSFetchedResultsControllerDelegate代理(方法2 当数据库内容改变时候 会调用这个方法)
-(void)controllerDidChangeContent:(NSFetchedResultsController *)controller{   
    //当好友改变时候,刷新表格
    [self.tableView reloadData];
}

二、聊天模块

添加《聊天模块》

    XMPPMessageArchiving *_msgArchiving;//聊天模块

@property(nonatomic, strong, readonly)XMPPMessageArchivingCoreDataStorage *msgStorage;//聊天数据存储模块


#pragma mark 下载聊天数据
-(void)loadMsgs{
    
    //1.上下文
    NSManagedObjectContext *context = [WCXMPPTool sharedWCXMPPTool].msgStorage.mainThreadManagedObjectContext;
    //2.请求对象
    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"XMPPMessageArchiving_Message_CoreDataObject"];
    //3.设置过滤 排序
    //自己的jid  , friendJid的user就是没有@后面的,bare就有.
    //streamBareJidStr是自己,bareJidStr好友
    NSString *jid = [WCUserInfo sharedWCUserInfo].jid;
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"streamBareJidStr = %@ AND bareJidStr = %@",jid,self.friendJid.bare];
    request.predicate = predicate;
    NSLog(@"%@",predicate);
    NSSortDescriptor *timesort = [NSSortDescriptor sortDescriptorWithKey:@"timestamp" ascending:YES];
    request.sortDescriptors = @[timesort];
    
    //4.执行请求获取数据
    _resultController = [[NSFetchedResultsController alloc]initWithFetchRequest:request managedObjectContext:context sectionNameKeyPath:nil cacheName:nil];
    _resultController.delegate = self;
    
    NSError *err = nil;
    [_resultController performFetch:&err];
    if (err) {
        WCLog(@"%@",err);
    }
}

#pragma mark _resultController中的fetchedObjects.body 就是获取的消息内容

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    
    static NSString *ID = @"ChatCell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
    if (!cell) {
        cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID];
    }
    XMPPMessageArchiving_Message_CoreDataObject *msg = _resultController.fetchedObjects[indexPath.row];
    if([msg.outgoing boolValue]){
        //显示消息
        cell.textLabel.text = [NSString stringWithFormat:@"Me:%@",msg.body];
    }else{
        //显示消息
        cell.textLabel.text = [NSString stringWithFormat:@"Other:%@",msg.body];
    }
    return cell;
}


#pragma mark 发送消息
-(void)sendMsgWithText:(NSString *)text{
    
    //设置内容
    XMPPMessage *msg = [XMPPMessage messageWithType:@"chat" to:self.friendJid];
    [msg addBody:text];
    //发送消息
    [[WCXMPPTool sharedWCXMPPTool].xmppStream sendElement:msg];
}

0 0
原创粉丝点击