最近在開發一個社交類app,要實現類似微信那種下拉刷新聊天記錄的功能。
一般有兩種實現方式:
1. 直接fetch一個entity的所有數據然后在內存中做filter,就是把所有聊天記錄先讀出來然后每次加載10條。
缺點:浪費內存 優點:速度快
2. 使用PRedicate,每次訪問數據庫讀取10條數據顯示。
缺點:速度比較慢,會有卡頓現象 優點:內存少
因為聊天記錄非常多,一次讀取太浪費內存了,決定還是每次下拉就從數據庫讀取10條顯示。
1 -(NSArray *)queryMessageResult 2 { 3 NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:NSStringFromClass([HistoryMessageLog class])]; 4 NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"time" ascending:NO]; 5 //把排序和分組規則添加到請求中,這樣聊天記錄根據時間倒序,最新的記錄在前面 6 [request setSortDescriptors:@[sortDescriptor]]; 7 8 [request setFetchLimit:10]; 9 [request setFetchOffset:self.FetchOffset];10 11 NSError *error;12 NSArray *messageArray = [[(id)[UIapplication sharedApplication].delegate managedObjectContext] executeFetchRequest:request error:&error];13 if ([messageArray count]) {14 //每次都要更新游標15 self.FetchOffset += [messageArray count];16 }17 return messageArray;18 19 }
這樣每次都能讀取10條記錄出去,這個實現比較容易,做復雜了可以根據時間來讀取一定的條數。
聊天的功能也做的差不多了,不過還有一些小問題,下面是截圖
如果有感興趣的朋友可以下載代碼去看看,然后一起交流。
github地址:https://github.com/stevenxiaoyang/Chat.git
新聞熱點
疑難解答