gpt4 book ai didi

ios - 在后台线程上执行 NSFetchedResultsController 的获取是一个好主意吗?

转载 作者:行者123 更新时间:2023-11-30 13:07:08 27 4
gpt4 key购买 nike

当用户运行应用程序时,他首先必须登录。如果登录成功,会触发一个名为setUpSaving的函数。在 setUpSaving 中,正如我在代码的注释部分中所写的那样,(“发生了一些 firebase 事情,抓取所有消息,对于每条消息,一条一条地通过 createMessageWithText 并将消息插入到核心数据中,最终保存它.”

所以,我的问题就在这里。假设用户有 20,000 条与他正在发消息的某人关联的消息。当他转到 ChatLogController 时,所有消息都必须呈现给用户。我这样做的方法是使用 NSFetchedResultsController 执行 fetch 来加载登录 Controller 中保存的所有消息。我的问题是,所有这些都在主队列上,有时,这会卡住 UI 相当长一段时间。我的 chatLogController 代码如下(不是全部,只是 fetchedResultsController 部分和 collectionView),我想知道如何在后台队列上执行 fetch,但仍然更新主队列上的 collectionView。

  func setUpSaving() {

///////some firebase stuff happens, grabs all the messages, and for each message, one by one, it goes through createMessageWithText and inserts the message into core data,
somewhere along the line context.save() gets triggered saving the message.


}

private func createMessageWithText(text: String, friend: Friend, context: NSManagedObjectContext, date: NSDate, isSender: Bool = false, sentStatus: String, fromID: String) -> Mesages {

let message = NSEntityDescription.insertNewObjectForEntityForName("Mesages", inManagedObjectContext: context) as! Mesages
message.user = friend
message.text = text
message.timestamp = date
message.isSender = isSender
message.fromID = fromID

message.status = sentStatus



return message

}

}

lazy var fetchedResultsControler: NSFetchedResultsController = {
let fetchRequest = NSFetchRequest(entityName: "Mesages")
fetchRequest.fetchBatchSize = 20
fetchRequest.includesPendingChanges = false
fetchRequest.sortDescriptors = [NSSortDescriptor(key: "timestamp", ascending: true)]
fetchRequest.predicate = NSPredicate(format: "user.id = %@", self.friend!.id!)
let moc = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext
let frc = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: moc, sectionNameKeyPath: nil, cacheName: nil)
frc.delegate = self
return frc
}()



override func viewDidLoad() {
super.viewDidLoad()
NavigationItems()
revealStatus()

do {
try fetchedResultsControler.performFetch()


} catch let err {
print(err)
}

override func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) ->

Int {
if let count = fetchedResultsControler.sections?[0].numberOfObjects {
return count
}
return 0
}

override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
let cell = super.collectionView(collectionView, cellForItemAtIndexPath: indexPath) as! JSQMessagesCollectionViewCell
return cell
}

最佳答案

不,您不应该获取将在后台线程上驱动 UI 的 FRC。

您的问题是登录后加载 20,000 个项目背后的想法。没有人可以或不会在移动设备上查看这么多的消息。您可能希望在登录后获得 20 以及总数,但仅此而已。

当用户查看消息时,您应该按需加载页面,可能包含 20 到 100 条消息。这样,您就不会使用用户未要求您使用的资源,也不会花费任何处理时间来执行此操作。

搜索也应该由服务器完成。

关于ios - 在后台线程上执行 NSFetchedResultsController 的获取是一个好主意吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39215766/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com