在macOS应用程序上获取12000个条目的请求速度非常慢,但在iOS应用程序上速度非常慢-尽管代码相同(macOS Big Sur/iOS 14上的SwiftUI) 编辑(可忽略以下原始文本)
我只使用手动获取(只执行一次)进行了一些进一步的测试似乎只是fetch请求(仅针对12000个实体)本身速度非常慢。尽管如此,我还是想知道,既然代码相同,为什么我应该只针对macOS而不是iOS发布这个问题 ========================================== 原职 我正在为macOS Big Sur/iOS 14开发一个简单的SwiftUI应用程序,它通过CloudKit同步“卡片”实体(没什么特别的;大约20个属性和7个关系)。但是,在导入(仅)12000个条目(来自解码的JSON文件)后,macOS应用程序(而不是iOS应用程序)变得不可用,即冻结/具有非常高的CPU使用率。奇怪的是,如果UI上没有显示数据,也会出现此问题,例如,使用以下简单视图: 主视图和卡片列表 AppDelegate 问题: 同样的数据已成功同步到应用程序的iOS版本,并且可以在那里显示,而不会出现任何性能问题(使用相同的控件,即LazyVStack)。然而,由于持续的高CPU使用率,macOS应用程序变得完全不可用。此外,我看不到任何会不断更改变量从而触发显示实体不断刷新(即触发新的获取请求)的内容 有人知道为什么会发生这个问题吗 提前感谢您的建议 塞巴斯蒂安在macOS应用程序上获取12000个条目的请求速度非常慢,但在iOS应用程序上速度非常慢-尽管代码相同(macOS Big Sur/iOS 14上的SwiftUI) 编辑(可忽略以下原始文本),swiftui,cloudkit,nsfetchrequest,Swiftui,Cloudkit,Nsfetchrequest,我只使用手动获取(只执行一次)进行了一些进一步的测试似乎只是fetch请求(仅针对12000个实体)本身速度非常慢。尽管如此,我还是想知道,既然代码相同,为什么我应该只针对macOS而不是iOS发布这个问题 ========================================== 原职 我正在为macOS Big Sur/iOS 14开发一个简单的SwiftUI应用程序,它通过CloudKit同步“卡片”实体(没什么特别的;大约20个属性和7个关系)。但是,在导入(仅)12000个条
※我注意到的一点是,Xcode在控制台中充斥着警告“NSKeyedUnachiveFromData”不应用于取消归档,并将在未来的版本中删除”,因为我仍然在卡实体上使用一些[String]-可转换属性。稍后我将讨论这个问题,但由于这个警告似乎一直显示,我想知道@FetchRequest是否一直获取/评估所有实体?此外,我假设显示的大量警告只会对Xcode的CPU使用产生影响?我解决了这个问题;似乎正是“NSKeyedUnachiveFromData”不应用于取消归档,并将在未来的版本中删除”这一警告导致了CPU使用量的激增将“NSSecureUnarchiveFromDataTransformer”设置为所有数据库实体的所有[String]-可转换属性后,问题消失。我解决了这个问题;似乎正是“NSKeyedUnachiveFromData”不应用于取消归档,并将在未来的版本中删除”这一警告导致了CPU使用量的激增将“NSSecureUnarchiveFromDataTransformer”设置为所有数据库实体的所有[String]-可转换属性后,问题消失了。
struct MainView: View {
@ObservedObject var model: MainViewModel
@Environment(\.colorScheme) var colorScheme
var body: some View {
CardList(predicate: Card.predicate(searchText: self.model.searchText,
pinned: self.model.filterPinned,
priority: self.model.getPrioritiesAsArray(),
subjects: self.model.selectedSubjects,
bundles: self.model.selectedBundles),
sortDescriptor: EntrySort(sortType: self.model.sortType, sortOrder:self.model.sortOrder).sortDescriptor,
model: self.model)
}
}
struct CardList: View {
@ObservedObject var model: MainViewModel
@Environment(\.colorScheme) var colorScheme
@Environment(\.managedObjectContext)
var context: NSManagedObjectContext
@FetchRequest(
entity: Card.entity(),
sortDescriptors: [
NSSortDescriptor(keyPath: \Card.id, ascending: false)
]
)
private var result: FetchedResults<Card>
init(predicate: NSPredicate?,
sortDescriptor: NSSortDescriptor,
model: MainViewModel) {
let fetchRequest = NSFetchRequest<Card>(entityName: "Card")
fetchRequest.sortDescriptors = [sortDescriptor]
if let predicate = predicate {
fetchRequest.predicate = predicate
}
_result = FetchRequest(fetchRequest: fetchRequest)
self.model = model
}
var body: some View {
Text("TEST")
}
}
class MainViewModel: ObservableObject {
@Published var searchText: String = ""
@Published var selectedSubjects: [Subject]?
@Published var selectedBundles: [Bundle]?
@Published var selectedTags: [Tag]?
@Published var filterPinned: Bool? = nil
@Published var filterPriorityVeryHigh: Bool = false
@Published var filterPriorityHigh: Bool = false
@Published var filterPriorityNormal: Bool = false
@Published var filterPriorityLow: Bool = false
func getPrioritiesAsArray() -> [CardPriority] {
var res: [CardPriority] = []
if self.filterPriorityLow { res.append(CardPriority.Low)}
if self.filterPriorityNormal { res.append(CardPriority.Normal)}
if self.filterPriorityHigh { res.append(CardPriority.High)}
if self.filterPriorityVeryHigh { res.append(CardPriority.VeryHigh)}
return res
}
@Published var sortType = SortType.dateCreated
@Published var sortOrder = SortOrder.ascending
}
import SwiftUI
@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {
var window: NSWindow!
var coreDataStack = CoreDataStack(modelName: "[Name of Model]")
var mainViewModel = MainViewModel()
func applicationDidFinishLaunching(_ aNotification: Notification) {
coreDataStack.viewContext.automaticallyMergesChangesFromParent = true
let mainView = MainView(model: mainViewModel)
.environment(\.managedObjectContext, coreDataStack.viewContext)
// ...
}