iOS开发之聊天模块--内容保存逻辑实现

需求详解:html

  在实际开发中,有多是在后期优化的时候,会有这么须要优化的需求:聊天输入框保存以前输入的文本,提升用户的良好体验。布局

   在聊天模块中,用户可能会在输入框输入若干字符,可是没有点击发送就点击退出聊天,或者要点击用户头像确认用户的信息,或者好比须要向好友发送另外一个好 友的ID不得不暂时退出当前好友聊天界面跳转找到别的界面找ID,然而当前聊天输入框也已经输入好了若干字符,用户固然不但愿退出以后就删除以前输入好的 文字。因此这里就须要暂时保存用户输入好的可是没有发送出去的字符串。post

  可是,还须要知足一、彻底杀掉或者彻底退出应用就须要清除这个暂时保存的字符串,二、发送出去以后,确定就要delegate以前暂时保存的字符串喽。学习

 

开始:优化

这部分逻辑的实现一开始我没怎么比较好的头绪,只想到本地序列化,但实际上这个还不算是最好的思路,由于本地序列化用到这里有点小题大作了,其实只要用全局静态变量的字典就能够了。编码

具体实现的逻辑,我也特地阅读研究了Coding项目的实现,毕竟这个项目是比较成熟的项目,聊天模块也作的很不错,因此学学别人的思想,正所谓站在巨人的肩膀上,也是很好的哦。url

 那么下面,我就直接解读Coding源码(学习Coding-iOS开源项目日志(一))在这个聊天模块内容保存的逻辑吧,就不拿本身工做开发的项目来说了。spa

一、首先声明全局static的变量,Coding中用inputStrDict存储输入框的字符串,而inputMediaDict我暂时不知道它具体存什么的,应该是media之类的元素:日志

 

二、而后将不少逻辑封装在这个UIMessageInputView类中,方法都不用公开,彻底利用UIMessageInputView活动周期的逻辑就能够了。code

 

  1 #pragma mark remember input  2  3 - (NSMutableDictionary *)shareInputStrDict{  4 if (!_inputStrDict) {  5 _inputStrDict = [[NSMutableDictionary alloc] init];  6  }  7 return _inputStrDict;  8 }  9  10 - (NSMutableDictionary *)shareInputMediaDict{  11 if (!_inputMediaDict) {  12 _inputMediaDict = [[NSMutableDictionary alloc] init];  13  }  14 return _inputMediaDict;  15 }  16  17 - (NSString *)inputKey{  18 NSString *inputKey = nil;  19 if (_contentType == UIMessageInputViewContentTypePriMsg) {  20 inputKey = [NSString stringWithFormat:@"privateMessage_%@", self.toUser.global_key];  21 }else{  22 if (_commentOfId) {  23 switch (_contentType) {  24 case UIMessageInputViewContentTypeTweet:  25 inputKey = [NSString stringWithFormat:@"tweet_%@_%@", _commentOfId.stringValue, _toUser.global_key.length > 0? _toUser.global_key:@""];  26 break;  27 case UIMessageInputViewContentTypeTopic:  28 inputKey = [NSString stringWithFormat:@"topic_%@_%@", _commentOfId.stringValue, _toUser.global_key.length > 0? _toUser.global_key:@""];  29 break;  30 case UIMessageInputViewContentTypeTask:  31 inputKey = [NSString stringWithFormat:@"task_%@_%@", _commentOfId.stringValue, _toUser.global_key.length > 0? _toUser.global_key:@""];  32 break;  33 default:  34 break;  35  }  36  }  37  }  38 return inputKey;  39 }  40  41 - (NSString *)inputStr{  42 NSString *inputKey = [self inputKey];  43 if (inputKey) {  44 DebugLog(@"inputStr_get:%@",[[self shareInputStrDict] objectForKey:inputKey]);  45 return [[self shareInputStrDict] objectForKey:inputKey];  46  }  47 return nil;  48 }  49  50 - (void)deleteInputData{  51 NSString *inputKey = [self inputKey];  52 DebugLog(@"inputKey_delegate:%@",inputKey);  53 if (inputKey) {  54  [[self shareInputStrDict] removeObjectForKey:inputKey];  55  [[self shareInputMediaDict] removeObjectForKey:inputKey];  56  }  57 }  58  59 - (void)saveInputStr{  60 NSString *inputStr = _inputTextView.text;  61 NSString *inputKey = [self inputKey];  62 DebugLog(@"inputKey_save:%@",inputKey);  63 if (inputKey && inputKey.length > 0) {  64 if (inputStr && inputStr.length > 0) {  65  [[self shareInputStrDict] setObject:inputStr forKey:inputKey];  66 }else{  67  [[self shareInputStrDict] removeObjectForKey:inputKey];  68  }  69  }  70 }  71  72 - (void)saveInputMedia{  73 NSString *inputKey = [self inputKey];  74 if (inputKey && inputKey.length > 0) { 75 if (_mediaList.count > 0) { 76 [[self shareInputMediaDict] setObject:_mediaList forKey:inputKey]; 77 }else{ 78 [[self shareInputMediaDict] removeObjectForKey:inputKey]; 79 } 80 } 81 } 82 83 - (NSMutableArray *)inputMedia{ 84 NSString *inputKey = [self inputKey]; 85 if (inputKey) { 86 return [[self shareInputMediaDict] objectForKey:inputKey]; 87 } 88 return nil; 89 } 90 91 - (void)setToUser:(User *)toUser{ 92 _toUser = toUser; 93 NSString *inputStr = [self inputStr]; 94 if (_inputTextView) { 95 if (_contentType != UIMessageInputViewContentTypePriMsg) { 96 self.placeHolder = _toUser? [NSString stringWithFormat:@"回复 %@", _toUser.name]: @"撰写评论"; 97 }else{ 98 self.placeHolder = @"请输入私信内容"; 99 } 100 _inputTextView.selectedRange = NSMakeRange(0, _inputTextView.text.length); 101 [_inputTextView insertText:inputStr? inputStr: @""]; 102 103 _mediaList = [self inputMedia]; 104 [self mediaListChenged]; 105 } 106 }

上面无非就是经过聊天对象的名字拼接成key值,而后对应存储当前输入框的字符串到全局static的字典中,而后是取出、删除的几个方法。

三、再看看那哪些地方调用了这些方法:

保 存的方法,放在frame重写的方法里,由于输入框会随着键盘的现实和隐藏而切换frame,不过我公司的项目一开始聊天模块是我同事开发的,我发现他用 Masonry的布局代码去变换输入框的位置,选择了布局约束也就意味着放弃了frame,因此何处调用save方法仍是要根据实际需求和实际的编码实 现。另外,其实在最开始开发这个输入框的时候,能够考虑其运做的周期:开始编辑->正在编辑->结束编辑,这些运做周期是能够实现出各自的方 法,就和一个控制器的生命周期同样。总之思路不少,作好是能实现出好管理好维护的逻辑。

 而后找找删除的方法,删除的方法是放在将字符串发出去的最前面,由于已经发送出去了,是能够将字典中存储的元素删除了去。

另外,在建立key的时候,这个key字符串是依赖当前聊天对象的,由于当前输入框的内容要和当前好友对象一一对应,不能我保存了当前好友对应的输入框内容,跳到别的好友却又出现了同样的内容。因此key值须要依据当前好友的字符串来决定,因此Coding源码中重写了ToUser属性的set方法:

 

尊重劳动成果,转载注明出处:http://www.cnblogs.com/goodboy-heyang/p/5782201.html

相关文章
相关标签/搜索