自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

iOS開(kāi)發(fā)之聊天模塊--內(nèi)容保存邏輯實(shí)現(xiàn)

移動(dòng)開(kāi)發(fā) iOS
iOS開(kāi)發(fā)聊天模塊內(nèi)容保存邏輯實(shí)現(xiàn),但還需要滿足1、完全殺掉或者完全退出應(yīng)用就需要清除這個(gè)暫時(shí)保存的字符串,2、發(fā)送出去之后,肯定就要delegate之前暫時(shí)保存的字符串。

需求詳解:

在實(shí)際開(kāi)發(fā)中,有可能是在后期優(yōu)化的時(shí)候,會(huì)有這么需要優(yōu)化的需求:聊天輸入框保存之前輸入的文本,提高用戶的良好體驗(yàn)。

在聊天模塊中,用戶可能會(huì)在輸入框輸入若干字符,但是沒(méi)有點(diǎn)擊發(fā)送就點(diǎn)擊退出聊天,或者要點(diǎn)擊用戶頭像確認(rèn)用戶的信息,或者比如需要向好友發(fā)送另一個(gè)好 友的ID不得不暫時(shí)退出當(dāng)前好友聊天界面跳轉(zhuǎn)找到別的界面找ID,然而當(dāng)前聊天輸入框也已經(jīng)輸入好了若干字符,用戶當(dāng)然不希望退出之后就刪除之前輸入好的 文字。所以這里就需要暫時(shí)保存用戶輸入好的但是沒(méi)有發(fā)送出去的字符串。

但是,還需要滿足1、完全殺掉或者完全退出應(yīng)用就需要清除這個(gè)暫時(shí)保存的字符串,2、發(fā)送出去之后,肯定就要delegate之前暫時(shí)保存的字符串嘍。

開(kāi)始:

這部分邏輯的實(shí)現(xiàn)一開(kāi)始我沒(méi)怎么比較好的頭緒,只想到本地序列化,但實(shí)際上這個(gè)還不算是***的思路,因?yàn)楸镜匦蛄谢玫竭@里有點(diǎn)小題大做了,其實(shí)只要用全局靜態(tài)變量的字典就可以了。

具體實(shí)現(xiàn)的邏輯,我也特意閱讀研究了Coding項(xiàng)目的實(shí)現(xiàn),畢竟這個(gè)項(xiàng)目是比較成熟的項(xiàng)目,聊天模塊也做的很不錯(cuò),所以學(xué)學(xué)別人的思想,正所謂站在巨人的肩膀上,也是很好的哦。

那么下面,我就直接解讀Coding源碼(學(xué)習(xí)Coding-iOS開(kāi)源項(xiàng)目日志(一))在這個(gè)聊天模塊內(nèi)容保存的邏輯吧,就不拿自己工作開(kāi)發(fā)的項(xiàng)目來(lái)講了。

1、首先聲明全局static的變量,Coding中用inputStrDict存儲(chǔ)輸入框的字符串,而inputMediaDict我暫時(shí)不知道它具體存什么的,應(yīng)該是media之類的元素:

2、然后將很多邏輯封裝在這個(gè)UIMessageInputView類中,方法都不用公開(kāi),完全利用UIMessageInputView活動(dòng)周期的邏輯就可以了。

  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. - (NSString *)inputKey{ 
  17.     NSString *inputKey = nil; 
  18.     if (_contentType == UIMessageInputViewContentTypePriMsg) { 
  19.         inputKey = [NSString stringWithFormat:@"privateMessage_%@", self.toUser.global_key]; 
  20.     }else
  21.         if (_commentOfId) { 
  22.             switch (_contentType) { 
  23.                 case UIMessageInputViewContentTypeTweet: 
  24.                     inputKey = [NSString stringWithFormat:@"tweet_%@_%@", _commentOfId.stringValue, _toUser.global_key.length > 0? _toUser.global_key:@""]; 
  25.                     break; 
  26.                 case UIMessageInputViewContentTypeTopic: 
  27.                     inputKey = [NSString stringWithFormat:@"topic_%@_%@", _commentOfId.stringValue, _toUser.global_key.length > 0? _toUser.global_key:@""]; 
  28.                     break; 
  29.                 case UIMessageInputViewContentTypeTask: 
  30.                     inputKey = [NSString stringWithFormat:@"task_%@_%@", _commentOfId.stringValue, _toUser.global_key.length > 0? _toUser.global_key:@""]; 
  31.                     break; 
  32.                 default
  33.                     break; 
  34.             } 
  35.         } 
  36.     } 
  37.     return inputKey; 
  38.  
  39. - (NSString *)inputStr{ 
  40.     NSString *inputKey = [self inputKey]; 
  41.     if (inputKey) { 
  42.         DebugLog(@"inputStr_get:%@",[[self shareInputStrDict] objectForKey:inputKey]); 
  43.         return [[self shareInputStrDict] objectForKey:inputKey]; 
  44.     } 
  45.     return nil; 
  46.  
  47. - (void)deleteInputData{ 
  48.     NSString *inputKey = [self inputKey]; 
  49.     DebugLog(@"inputKey_delegate:%@",inputKey); 
  50.     if (inputKey) { 
  51.         [[self shareInputStrDict] removeObjectForKey:inputKey]; 
  52.         [[self shareInputMediaDict] removeObjectForKey:inputKey]; 
  53.     } 
  54.  
  55. - (void)saveInputStr{ 
  56.     NSString *inputStr = _inputTextView.text; 
  57.     NSString *inputKey = [self inputKey]; 
  58.     DebugLog(@"inputKey_save:%@",inputKey); 
  59.     if (inputKey && inputKey.length > 0) { 
  60.         if (inputStr && inputStr.length > 0) { 
  61.             [[self shareInputStrDict] setObject:inputStr forKey:inputKey]; 
  62.         }else
  63.             [[self shareInputStrDict] removeObjectForKey:inputKey]; 
  64.         } 
  65.     } 
  66.  
  67. - (void)saveInputMedia{ 
  68.     NSString *inputKey = [self inputKey]; 
  69.     if (inputKey && inputKey.length > 0) { 
  70.         if (_mediaList.count > 0) { 
  71.             [[self shareInputMediaDict] setObject:_mediaList forKey:inputKey]; 
  72.         }else
  73.             [[self shareInputMediaDict] removeObjectForKey:inputKey]; 
  74.         } 
  75.     } 
  76.  
  77. - (NSMutableArray *)inputMedia{ 
  78.     NSString *inputKey = [self inputKey]; 
  79.     if (inputKey) { 
  80.         return [[self shareInputMediaDict] objectForKey:inputKey]; 
  81.     } 
  82.     return nil; 
  83.  
  84. - (void)setToUser:(User *)toUser{ 
  85.     _toUser = toUser; 
  86.     NSString *inputStr = [self inputStr]; 
  87.     if (_inputTextView) { 
  88.         if (_contentType != UIMessageInputViewContentTypePriMsg) { 
  89.             self.placeHolder = _toUser? [NSString stringWithFormat:@"回復(fù) %@", _toUser.name]: @"撰寫評(píng)論"
  90.         }else
  91.             self.placeHolder = @"請(qǐng)輸入私信內(nèi)容"
  92.         } 
  93.        _inputTextView.selectedRange = NSMakeRange(0, _inputTextView.text.length); 
  94.        [_inputTextView insertText:inputStr? inputStr: @""]; 
  95.         
  96.        _mediaList = [self inputMedia]; 
  97.        [self mediaListChenged]; 
  98.    } 

上面無(wú)非就是通過(guò)聊天對(duì)象的名字拼接成key值,然后對(duì)應(yīng)存儲(chǔ)當(dāng)前輸入框的字符串到全局static的字典中,然后是取出、刪除的幾個(gè)方法。

3、再看看那哪些地方調(diào)用了這些方法:

保 存的方法,放在frame重寫的方法里,因?yàn)檩斎肟驎?huì)隨著鍵盤的現(xiàn)實(shí)和隱藏而切換frame,不過(guò)我公司的項(xiàng)目一開(kāi)始聊天模塊是我同事開(kāi)發(fā)的,我發(fā)現(xiàn)他用 Masonry的布局代碼去變換輸入框的位置,選擇了布局約束也就意味著放棄了frame,所以何處調(diào)用save方法還是要根據(jù)實(shí)際需求和實(shí)際的編碼實(shí) 現(xiàn)。另外,其實(shí)在最開(kāi)始開(kāi)發(fā)這個(gè)輸入框的時(shí)候,可以考慮其運(yùn)作的周期:開(kāi)始編輯->正在編輯->結(jié)束編輯,這些運(yùn)作周期是可以實(shí)現(xiàn)出各自的方 法,就和一個(gè)控制器的生命周期一樣??傊悸泛芏?,做好是能實(shí)現(xiàn)出好管理好維護(hù)的邏輯。

然后找找刪除的方法,刪除的方法是放在將字符串發(fā)出去的最前面,因?yàn)橐呀?jīng)發(fā)送出去了,是可以將字典中存儲(chǔ)的元素刪除了去。

另外,在創(chuàng)建key的時(shí)候,這個(gè)key字符串是依賴當(dāng)前聊天對(duì)象的,因?yàn)楫?dāng)前輸入框的內(nèi)容要和當(dāng)前好友對(duì)象一一對(duì)應(yīng),不能我保存了當(dāng)前好友對(duì)應(yīng)的輸入框內(nèi)容,跳到別的好友卻又出現(xiàn)了一樣的內(nèi)容。所以key值需要依據(jù)當(dāng)前好友的字符串來(lái)決定,所以Coding源碼中重寫了ToUser屬性的set方法:

 

責(zé)任編輯:武曉燕 來(lái)源: 博客園
相關(guān)推薦

2015-08-06 16:23:04

iosxmpp聊天

2016-05-10 13:21:23

reactios原生模塊

2014-07-21 14:49:35

iOSUILabel

2014-07-23 13:17:53

iOSUITextField

2017-02-15 09:25:36

iOS開(kāi)發(fā)MQTT

2011-08-02 11:07:42

iOS開(kāi)發(fā) UIWebView

2011-08-11 16:50:04

iOSTwitter

2014-08-08 10:12:44

IRC

2013-07-25 15:19:23

iOS開(kāi)發(fā)學(xué)習(xí)Xcode打包framiOS開(kāi)發(fā)

2013-07-25 15:15:26

iOS開(kāi)發(fā)學(xué)習(xí)iOS全局變量

2013-04-11 16:08:50

iOS開(kāi)發(fā)技巧積累

2013-07-29 04:51:41

iOS開(kāi)發(fā)iOS開(kāi)發(fā)學(xué)習(xí)file列表查看

2012-12-11 10:15:02

Winform開(kāi)發(fā)框架

2014-04-22 10:19:40

objection模塊化開(kāi)發(fā)iOS

2011-04-13 16:59:41

HTTPASP.NET

2013-07-23 07:34:54

iOS開(kāi)發(fā)學(xué)習(xí)適配iphone5

2012-01-18 13:46:37

ARCiOS

2011-08-02 11:30:41

iOS開(kāi)發(fā) 郵件發(fā)送

2011-08-02 09:22:41

iOS iPhone

2013-07-29 05:01:31

iOS開(kāi)發(fā)iOS開(kāi)發(fā)學(xué)習(xí)按鈕拖動(dòng)和點(diǎn)擊
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)