gpt4 book ai didi

ios - 是否可以在 NSFetchedResultsController 上使用后台线程进行大量读取操作以确保 UI 响应?

转载 作者:行者123 更新时间:2023-12-04 13:28:15 24 4
gpt4 key购买 nike

Apple 在他们的官方地震示例 - https://github.com/yccheok/earthquakes-WWDC20 中向我们展示了如何使用后台线程(通过使用 newBackgroundContext)执行大量写入操作。
但是,重读操作呢? (数百万行用于压力测试)
我们还希望我们的应用程序 UI 具有响应性,当我们第一次启动应用程序时,应用程序正在从 CoreData 读取大量数据。
以下是使用 NSFetchedResultController 的代码片段.

如果有很多行,UI 没有响应能力

let controller = NSFetchedResultsController(fetchRequest: fetchRequest,
managedObjectContext: persistentContainer.viewContext,
sectionNameKeyPath: nil, cacheName: nil)
controller.delegate = fetchedResultsControllerDelegate

// Perform the fetch.
do {
// This statement tooks some time to complete if you have a lot of rows.
try controller.performFetch()
} catch {
fatalError("Unresolved error \(error)")
}

如果有很多行,UI 没有响应能力
我们尝试执行 controller.performFetch()使用后台线程。 尽管如此,但不知道为什么,UI 仍然没有响应 .我的猜测是,在 NSFetchedResultsController 之后占用UI主线程,执行一些耗时的I/O读操作。
let controller = NSFetchedResultsController(fetchRequest: fetchRequest,
managedObjectContext: persistentContainer.viewContext,
sectionNameKeyPath: nil, cacheName: nil)
controller.delegate = fetchedResultsControllerDelegate

DispatchQueue.global(qos: .background).async {
// Perform the fetch.
do {
// This statement tooks some time to complete if you have a lot of rows.
try controller.performFetch()
} catch {
fatalError("Unresolved error \(error)")
}
}

UI 现在是响应式的。但解决方案是不正确的...
我想,我们需要放置 NSFetchedresultController也在后台线程下。因此,我们进行以下修改。
let backgroundContext = persistentContainer.newBackgroundContext()
let controller = NSFetchedResultsController(fetchRequest: fetchRequest,
managedObjectContext: backgroundContext,
sectionNameKeyPath: nil, cacheName: nil)
controller.delegate = fetchedResultsControllerDelegate

backgroundContext.perform {
// Perform the fetch.
do {
// This statement tooks some time to complete if you have a lot of rows.
try controller.performFetch()
} catch {
fatalError("Unresolved error \(error)")
}
}
UI在获取过程中具有响应性,并且可以在一段时间后获取并显示数据。
但是,如果我们使用 launch 参数进一步调查
-com.apple.CoreData.ConcurrencyDebug 1
我们将在 controller.performFetch() 之后遇到以下崩溃完成执行。
CoreData`+[NSManagedObjectContext __Multithreading_Violation_AllThatIsLeftToUsIsHonor__]:
我可以知道,当我们使用 NSFetchedResultController 时,是否有可能使 UI 具有响应性?加载大量数据(根据测试几百万行)?可以 NSFetchedResultController曾经在后台线程下操作过吗?

最佳答案

我认为您的问题可能是 fetchedResultsControllerDelegate 的分配问题通过新的 Controller 。这似乎可以从您遇到多线程违规的地方推断出来。
从您提供的代码中,不清楚委托(delegate)是什么类型的对象,但大概它管理 UI,因此在主线程上。您可以看到这可能会导致线程问题。
感谢您从我的回答中发布此问题的链接 https://stackoverflow.com/a/14710475/427083 .如果您将 FRC 分配为 datasource,我仍然认为它应该对您有用。完成后,然后 reloadData .
附带说明:虽然我发现这个问题从工程的角度来看很有趣且具有挑战性,但我怀疑直接在移动设备上处理数百万条记录是否是一个好的架构。

关于ios - 是否可以在 NSFetchedResultsController 上使用后台线程进行大量读取操作以确保 UI 响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66789397/

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