1. 想法
最近在開發一個社交類app,要實現類似微信那種下拉刷新聊天記錄的功能。
一般有兩種實現方式:
1. 直接fetch一個entity的所有數據然后在內存中做filter,就是把所有聊天記錄先讀出來然后每次加載10條。
缺點:浪費內存 優點:速度快
2. 使用predicate,每次訪問數據庫讀取10條數據顯示。
缺點:速度比較慢,會有卡頓現象 優點:內存少
2. 實現
因為聊天記錄非常多,一次讀取太浪費內存了,決定還是每次下拉就從數據庫讀取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條記錄出去,這個實現比較容易,做復雜了可以根據時間來讀取一定的條數。
3. 代碼
聊天的功能也做的差不多了,不過還有一些小問題,下面是截圖
如果有感興趣的朋友可以下載代碼去看看,然后一起交流。
github地址:https://github.com/stevenxiaoyang/Chat.git