iOS开发记录iOS学习开发iOS 开发继续加油

融云三(自定义红包状态)

2018-07-11  本文已影响1人  蚯小麦
上篇文章讲了怎么自定义消息和自定义消息cell,这篇讲解怎么模拟红包发送和领取的思路!
红包接收

这其中我们规定消息的附加字段extra的格式为 0/messageUId 1/messageUId
其中0 ,1各代表红包未领取和红包领取的状态,而messageUId是服务器消息唯一ID(在同一个Appkey下全局唯一),我们用它来找到数据库中需要变更状态的那条消息。

 HongBaoMessage *mes = [[HongBaoMessage alloc] init];
        mes.senderUserInfo = [RCIM sharedRCIM].currentUserInfo;
        mes.money = @"4000";
        mes.extra = @"0";
        [[RCIM sharedRCIM] sendMessage:ConversationType_PRIVATE targetId:self.targetId content:mes pushContent:nil pushData:nil success:^(long messageId) {
            
        } error:^(RCErrorCode nErrorCode, long messageId) {
            
        }];
HongBaoMessage *mes = [[HongBaoMessage alloc] init];
        mes.senderUserInfo = [RCIM sharedRCIM].currentUserInfo;
        mes.money = @"已收到4000钱";
        mes.extra = [NSString stringWithFormat:@"1/%@",model.messageUId];
        
        [[RCIM sharedRCIM] sendMessage:ConversationType_PRIVATE targetId:self.targetId content:mes pushContent:nil pushData:nil success:^(long messageId) {
            
            RCMessage *oldMess = [[RCIMClient sharedRCIMClient] getMessageByUId:model.messageUId];
            [[RCIMClient sharedRCIMClient] setMessageExtra:oldMess.messageId value:mes.extra];
            dispatch_sync(dispatch_get_main_queue(), ^{
                for (RCMessageModel *model in self.conversationDataRepository) {
                    if (model.messageId == oldMess.messageId) {
                        HongBaoMessage *oldHongBao = (HongBaoMessage *)model.content;
                        oldHongBao.extra = mes.extra;
                        model.content = oldHongBao;
                    }
                }
                
                [self.conversationMessageCollectionView reloadData];

在上面的方法中,首先,我们拼接extra的格式为1/messageUId,然后我们根据
messageUId拿到会话中的RCMessage对象RCMessage *oldMess = [[RCIMClient sharedRCIMClient] getMessageByUId:model.messageUId];
因为融云不像环信一样可以直接更新某条消息的状态,所以我们只能[[RCIMClient sharedRCIMClient] setMessageExtra:oldMess.messageId value:mes.extra];这样去更新一下这个消息的拓展属性。接下来的循环就是去变更发送的那条消息为已领取的状态,实时刷新UI(融云也没有实时更新UI的方法,只能去更改数据源去刷新)。

综上接收方的代码已经完成
接下来我们去看发送方,怎么去更新UI
- (void)onRCIMReceiveMessage:(RCMessage *)message left:(int)left {
    if ([message.content isKindOfClass:[HongBaoMessage class]]) {
        HongBaoMessage *mes = (HongBaoMessage *)message.content;
        NSString *ex = mes.extra;

        NSString *sta = [ex componentsSeparatedByString:@"/"][0];
        NSString *oldMessID = [ex componentsSeparatedByString:@"/"][1];
        if ([sta isEqualToString:@"1"])  {//已接收
            dispatch_sync(dispatch_get_main_queue(), ^{
                RCMessage *oldMess = [[RCIMClient sharedRCIMClient] getMessageByUId:oldMessID];

                for (RCMessageModel *model in self.conversationDataRepository) {
                        if (model.messageId == oldMess.messageId) {
                            HongBaoMessage *oldHongBao = (HongBaoMessage *)model.content;
                            oldHongBao.extra = ex;
                            model.content = oldHongBao;
                        }
                    }
                [[RCIMClient sharedRCIMClient] setMessageExtra:oldMess.messageId value:mes.extra];
                
                [self.conversationMessageCollectionView reloadData];
            });
            
        }
    }
}

上面代码表示,首先过滤如果收到的是红包消息,并且判断extra 值,看是否是对方已接收的状态,接下里的处理和接收方的实现一样,直接刷新UI即可。

划重点一定要实现 [[RCIMClient sharedRCIMClient] setMessageExtra:oldMess.messageId value:mes.extra]; 这个方法,否则你退出会话,重新进入的时候,发送者的那条消息还是未领取状态,是不会更改的。

打工是不可能的
上一篇 下一篇

猜你喜欢

热点阅读