下面所有的IM框架的描述,都是基于我现在项目的框架的总结,希望有用同样的通信方式的同学看到了,可以给出一些建议。
这里的通信方式是通过socket发送和接收,并且服务器收到客户端发送的消息后,会回复一个ACK。
IM主体功能:
1、发送消息,消息发送状态反馈(成功,超时)
2、接收消息,通过广播的方式通知到视图层。
MessageCenter的主要工作:
1、创建消息结构体
2、发送消息
3、接收消息
4、写数据库(历史消息,最新消息 等)
5、消息发送状态监听,与反馈
** 需要注意的就是消息状态监听,需要保存消息状态回调。
messageCenter分成2条主要是流程图:
1、发送流程图
2、接收流程图
消息代理的详细代码:
前提条件:
1、每一个消息都有一个唯一的消息ID
消息状态更新具体设计:
//消息代理,用来保存发送出去的消息和需要返回消息状态的回调。
@interface RSMessageCenterTaskDelegate : NSObject
@property (nonatomic, weak) MessageCenter *messageManager;
@property (nonatomic, copy) MessageTaskCompletionHandler completionHandler;
@property (nonatomic, strong) ChatMessage *chatMessage;
@end
@interface MessageCenter()<IMSocketDelegate, WebSocketConnectionDelegate>
@property (readwrite, nonatomic, strong) NSMutableDictionary *mutableTaskDelegatesKeyedByMessageIdentifier;
@property (readwrite, nonatomic, strong) NSLock *lock;
@property (readwrite, nonatomic, strong) NSTimer *checktTimeOutTimer;
@end
- (instancetype)init
{
self = [super init];
if (self) {
self.mutableTaskDelegatesKeyedByMessageIdentifier = [[NSMutableDictionary alloc]init];
self.lock = [[NSLock alloc]init];
self.lock.name = @“RSMESSAGE_TASK_LOCK”;
self.checktTimeOutTimer = [NSTimer scheduledTimerWithTimeInterval:3 target:self selector:@selector(checkSocketSendTimerOut) userInfo:nil repeats:true];
[[NSRunLoop currentRunLoop]addTimer:checktTimeOutTimer forMode:NSRunLoopCommonModes];
}
}
- (void)checkSocketSendTimerOut
{
//根据自己的超时要求判断超时,并执行想要的回调
}
#pragma -mark MessageCnter callback
- (void)setDelegate:(RSMessageCenterTaskDelegate *)delegate forMessage:(NSString *)messageKey
{
[self.lock lock];
self.mutableTaskDelegatesKeyedByMessageIdentifier[messageKey] = delegate;
[self.lock unlock];
}
- (void)removeDelegateForMessage:(NSString *)messageKey
{
[self.lock lock];
[self.mutableTaskDelegatesKeyedByMessageIdentifier removeObjectForKey:messageKey];
[self.lock unlock];
}
- (void)addDelegateForMessage:(ChatMessage *)chatMessageData completionHandler:(MessageTaskCompletionHandler)completionHandler
{
RSMessageCenterTaskDelegate *delegate = [[RSMessageCenterTaskDelegate alloc]init];
delegate.completionHandler = completionHandler;
delegate.messageManager = self;
delegate.chatMessage = chatMessageData;
NSString *messageKey = [self messageDelegateKey:chatMessageData.messageId];
[self setDelegate:delegate forMessage:messageKey];
}
网友评论