gpt4 book ai didi

iOS Core Data - 当许多上下文同时保存时如何避免崩溃?

转载 作者:行者123 更新时间:2023-11-30 12:04:08 26 4
gpt4 key购买 nike

当许多上下文同时保存时,我尝试避免崩溃。

下面的类有一个操作队列,它同时只操作一项工作。它具有三个上下文。首先,defaultContext是主队列类型,它不会直接更新,仅对用户可见。另外两个上下文是 localContext 和 externalContext。

LocalContext 用于用户的日程添加,external Context 用于外部日程更新,如云同步。本地上下文和外部上下文是defaultContext 的子级,并将其automaticMergesChangesFromParent 属性设置为true。即使用户更新和外部更新同时实现。由于它们在同一队列中顺序运行,因此不会丢失数据。

当数据输入很小时它效果很好。但是当传入的数据过多时,应用程序会变慢。有没有更好的方法?

这是我的代码。

class DataController {

static let shared = DataController()

var schedules: [Schedule] = []

var persistentContainer: NSPersistentContainer

let persistentContainerQueue = OperationQueue()

private init() {
persistentContainerQueue.maxConcurrentOperationCount = 1

persistentContainer = NSPersistentContainer(name: "CoreDataConcurrency")
persistentContainer.loadPersistentStores { (description, error) in
if let error = error {
fatalError("Failed to load Core Data stack: \(error)")
}
}
}

lazy var defaultContext: NSManagedObjectContext = {
[unowned self] in
self.persistentContainer.viewContext
}()

lazy var localContext: NSManagedObjectContext = {
[unowned self] in
let context = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType)
context.parent = self.defaultContext
context.automaticallyMergesChangesFromParent = true
return context
}()

lazy var externalContext: NSManagedObjectContext = {
[unowned self] in
let context = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType)
context.parent = self.defaultContext
context.automaticallyMergesChangesFromParent = true
return context
}()

func enqueueCoreDataOperation(context: NSManagedObjectContext, changeBlock: @escaping () -> (NSManagedObjectContext)) {
persistentContainerQueue.addOperation {
let changedContext = changeBlock()

guard changedContext.hasChanges else {
return
}

changedContext.performAndWait({
do {
try changedContext.save()

if let parentContext = changedContext.parent {
do {
try parentContext.save()
} catch {
fatalError()
}
}
} catch {
fatalError()
}
})
}
}

func addSchedule(title: String, date: Date, context: NSManagedObjectContext) {
let changeBlock: () -> (NSManagedObjectContext) = {
let schedule = NSEntityDescription.insertNewObject(forEntityName: "Schedule", into: context) as! Schedule

schedule.title = title
schedule.date = date

return context
}

enqueueCoreDataOperation(context: context, changeBlock: changeBlock)
}

func updateSchedule(schedule: Schedule, modifiedTitle: String, context: NSManagedObjectContext) {

let scheduleInContext = context.object(with: schedule.objectID) as! Schedule

let changeBlock: () -> (NSManagedObjectContext) = {
scheduleInContext.title = modifiedTitle

return context
}

enqueueCoreDataOperation(context: context, changeBlock: changeBlock)
}
}

最佳答案

您可以将传入数据分成较小的批处理,以便每个操作花费更少的时间,并为操作添加优先级,以便基于云的更改具有较低的优先级。然后他们将不再阻止其他更改。但我强烈怀疑您在导入操作中做错了什么,导致时间过长。您是否正在为每个导入的实体进行提取?请分享该代码。

关于iOS Core Data - 当许多上下文同时保存时如何避免崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46860522/

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