在macOS应用程序上获取12000个条目的请求速度非常慢,但在iOS应用程序上速度非常慢-尽管代码相同(macOS Big Sur/iOS 14上的SwiftUI) 编辑(可忽略以下原始文本)

在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个条

我只使用手动获取(只执行一次)进行了一些进一步的测试似乎只是fetch请求(仅针对12000个实体)本身速度非常慢。尽管如此,我还是想知道,既然代码相同,为什么我应该只针对macOS而不是iOS发布这个问题

==========================================

原职 我正在为macOS Big Sur/iOS 14开发一个简单的SwiftUI应用程序,它通过CloudKit同步“卡片”实体(没什么特别的;大约20个属性和7个关系)。但是,在导入(仅)12000个条目(来自解码的JSON文件)后,macOS应用程序(而不是iOS应用程序)变得不可用,即冻结/具有非常高的CPU使用率。奇怪的是,如果UI上没有显示数据,也会出现此问题,例如,使用以下简单视图:

主视图和卡片列表 AppDelegate 问题: 同样的数据已成功同步到应用程序的iOS版本,并且可以在那里显示,而不会出现任何性能问题(使用相同的控件,即LazyVStack)。然而,由于持续的高CPU使用率,macOS应用程序变得完全不可用。此外,我看不到任何会不断更改变量从而触发显示实体不断刷新(即触发新的获取请求)的内容

有人知道为什么会发生这个问题吗

提前感谢您的建议

塞巴斯蒂安


※我注意到的一点是,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) 
// ...
}