【发布时间】:2018-06-02 07:18:06
【问题描述】:
我正在使用 NSFetchedResultsController 在聊天室应用中显示消息。
上下文变量在 appDelegate 中分配,并引用聊天室中使用的上下文。
let context = persistentContainer.viewContext
我在viewDidLoad中初始化NSFRC如下:
func initializeResultsController() {
let request = NSFetchRequest<Message>(entityName: "Message")
let messageSort = NSSortDescriptor(key: "dateCreated", ascending: true)
request.sortDescriptors = [messageSort]
request.predicate = NSPredicate(format: "chatRoomId == %@", self.chatRoomId)
request.fetchBatchSize = 30
fetchedResultsController = NSFetchedResultsController(fetchRequest: request, managedObjectContext: context, sectionNameKeyPath: "messageDateSectionIdentifier", cacheName: self.chatRoomId)
fetchedResultsController.delegate = self
do {
try fetchedResultsController.performFetch()
} catch {
fatalError("Failed to initialize FetchedResultsController: \(error)")
}
}
sectionNameKeyPath ("messageDateSectionIdentifier") 是一个派生属性,因此可以将部分划分为日历日。
我有两个问题。首先,batchSize 似乎被忽略了,其次缓存似乎对性能没有影响。消息越多,选择聊天室时的延迟时间就越长。 1500 条消息大约需要 1 秒。
当我编辑方案以在控制台中显示 coreData 信息时,在视图首次出现时多次执行 30 行的批处理请求,在一种情况下,数组大小为 1500。不确定这是故障数组还是填充的大批。控制台打印输出为:
CoreData: annotation: sql connection fetch time: 0.0013s
CoreData: annotation: total fetch execution time: 0.0014s for 1454 rows.
CoreData: annotation: Bound intarray _Z_intarray0
CoreData: annotation: Bound intarray values.
在此之后重复多次,值为 30 行。
我尝试将 sectionNameKeyPath 简化为 dateCreated 以查看派生部分是否存在问题,但根本没有区别。我还应该提到,与所有聊天应用程序一样,应用程序在显示时最初会滚动到底部。
我想要的是缓存工作以及 fetchBatchSize 工作,以便最初从 coreData 获取 30 行,直到用户开始向上滚动。现在由这种方法引起的延迟对我的应用性能产生了可衡量的影响。
【问题讨论】:
标签: ios swift xcode core-data nsfetchedresultscontroller