xmpp整理筆記:聊天資訊的發送與顯示,xmpp整理

來源:互聯網
上載者:User

xmpp整理筆記:聊天資訊的發送與顯示,xmpp整理

任何一個資訊的發送都需要關注兩個部分,資訊的發出,和資訊在介面中的顯示

往期回顧:

xmpp整理筆記:環境的快速配置(附安裝包)  http://www.cnblogs.com/dsxniubility/p/4304570.html

xmpp整理筆記:xmppFramework架構的匯入和介紹  http://www.cnblogs.com/dsxniubility/p/4307057.html

xmpp整理筆記:使用者網路連接及好友管理 http://www.cnblogs.com/dsxniubility/p/4307066.html

需要注意一點:

聊天介面輸入框並不是textField而是textView,因為textView可以控制多行資訊間的上下滾動編輯,如果下面的聊天框用的是普通的textField你可以想象會出現什麼情況。

用模擬器程式和小鴨子聊天如下:

如果你不是在董鉑然部落格園看到本文 請點擊查看原文

 

一。資訊的發送首先要有一個結果調度器

這是通過coredata從SQLlite取資料的必要操作。所有代碼寫在這個懶載入中

- (NSFetchedResultsController *)fetchedResultsController {    // 推薦寫法,減少嵌套的層次    if (_fetchedResultsController != nil) {        return _fetchedResultsController;    }        // 先確定需要用到哪個實體    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"XMPPMessageArchiving_Message_CoreDataObject"];        // 排序    NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"timestamp" ascending:YES];    request.sortDescriptors = @[sort];        // 每一個聊天介面,只關心聊天對象的訊息    request.predicate = [NSPredicate predicateWithFormat:@"bareJidStr = %@", self.chatJID.bare];        // 從自己寫的工具類裡的屬性中得到上下文    NSManagedObjectContext *ctx = [SXXMPPTools sharedXMPPTools].xmppMessageArchivingCoreDataStorage.mainThreadManagedObjectContext;        // 執行個體化,裡面要填上上面的各種參數    _fetchedResultsController = [[NSFetchedResultsController alloc]       initWithFetchRequest:request managedObjectContext:ctx sectionNameKeyPath:nil cacheName:nil];    _fetchedResultsController.delegate = self;        return _fetchedResultsController;}

 

寫完了結果調度器之後要切記在viewdidload頁面首次載入中加上一句,否則不幹活

// 查詢資料    [self.fetchedResultsController performFetch:NULL];

 

發送出訊息 

因為textView裡面沒有類似textField的shouldReturn的方法 直接發送資訊

所以只能對textView的《代理方法之文本改變方法》 稍加處理達到文本發送的目的

#pragma mark - ******************** textView代理方法- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text{    // 判斷按下的是不是斷行符號鍵。    if ([text isEqualToString:@"\n"]) {                // 自訂的資訊發送方法,傳入字串直接發出去。        [self sendMessage:textView.text];                self.textView.text = nil;                return NO;    }    return YES;}

 在輸入時如果按下斷行符號鍵那觸發代理方法傳入的這個字元就是"\n" 就會調用自己寫的 這個sendMessage方法,傳入一個字串直接發出去。

 

這個方法內部把傳入的文本先addBody 再用自己手寫的單例類的xmpp流 發出去。

#pragma mark - ******************** 發送訊息方法/** 發送資訊 */- (void)sendMessage:(NSString *)message{    XMPPMessage *msg = [XMPPMessage messageWithType:@"chat" to:self.chatJID];        [msg addBody:message];        [[SXXMPPTools sharedXMPPTools].xmppStream sendElement:msg];}

 

二。資訊在tableView中的顯示

是在tableView的資料來源方法中,先從資料庫中取出當前的資訊,再判斷是發出去的還是接收的。取到不同的可重用標識符,然後賦值

    // 取出當前行的訊息    XMPPMessageArchiving_Message_CoreDataObject *message = [self.fetchedResultsController objectAtIndexPath:indexPath];// 判斷是發出訊息還是接收訊息    NSString *ID = ([message.outgoing intValue] == 1) ? @"SendCell" : @"ReciveCell" ;    SXChatCell *cell = [tableview dequeueReusableCellWithIdentifier:ID];    cell.messageLabel.text = message.body;

 其中sx開的的類名都是我自訂的類,裡面都是常規寫法。

 

關於上面提到的工具類SXXmppTools裡 這個模組需要用到得屬性和方法有

/** xmpp流 */@property(nonatomic,strong,readonly) XMPPStream * xmppStream;/** 訊息歸檔 */@property (nonatomic, strong, readonly) XMPPMessageArchiving *xmppMessageArchiving;/** 訊息Archive Storage */@property (nonatomic, strong, readonly) XMPPMessageArchivingCoreDataStorage *xmppMessageArchivingCoreDataStorage;+ (instancetype)sharedXMPPTools;

 

這裡有一點需要注意,

因為預設情況下你一進入一位好友的聊天頁面,你和所有好友的聊天記錄都會顯示。因為都是存在同一個資料表裡的啊,因此需要做一層過濾,就是懶載入中的這行代碼

// 每一個聊天介面,只關心聊天對象的訊息    request.predicate = [NSPredicate predicateWithFormat:@"bareJidStr = %@", self.chatJID.bare];

 如果你不是在董鉑然部落格園看到本文 請點擊查看原文

正在整理音頻檔案和圖片檔案的發送方法,有興趣的可以關注我。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.