[SwiftUI 100天] 条件化保存 NSManagedObjectContext


译自 www.hackingwithswift.com/books/ios-s…
更多内容,欢迎注重大众号 「Swift花园」
喜欢文章?不如来个 ➕三连?注重专栏,注重我

条件化保存 NSManagedObjectContext

我们之前运用NSManagedObjec| T } r R YtContextsave()办法把全部未保存的更改 flush 到永久存储中,但我们没有完成的是查看更改是否真的需要被保存。一般来说这不会S ] L o * N有问题,g p 4 4 H因为通常我们是在做出比方插入或许删去的操作之后,才调用save()办法。

不过,把全部的保存动作批量处理也是很常见的,这样你可以一次保存全部的东西,关于功用的影响也更小。实际上,Apple 特别指出,我们应该总是在调用q d & = #save()之前查看更改,以防止 Core Data 做不必要的作业。

走运的是,我们可以用两种办法来查看更改。首要,每E } 0 0 [个保管方针都有一个hasChanges特色,当方针有未保存的改动时,这个特色的值为true,而且整个 context 也有一个hasChanges特色,用Q 1 u U于查看 context 全部具有的方针中,是C 7 9 h a T否有方针包含改动。

因此,与其直接e l R x | F f ) /调用sa: E C c ! {ve(),你可以总是先做一个查看,像这样:

if self.moc.hasChanges {
try? self.moc.save()
}

这个改动很小,但很重要 —— 做不必要的作业是没有意义的,不论这作业量有H v 3 j % 0 f 1 *多小,特别当你做了许多的小工程,你会意识到它们毕竟聚集成了大工程。

译自 www.hack# & B G ? O Y 1ingwithy ` ) b * f a yswift.com/books/io5 ] g Xs-s…

通过捆绑保证 Core Data 方针是仅有的

默许情况下,Core Data 会添加任何你要的方针,8 K P ! A K & m u但这样做很快会遭受费事,特别是你知道两个或许更多方针相同是不合理的。举个比方,假如你用邮件地址存储了许多通讯录的细节,那么多个不同通讯录附属于相同的邮件地址就是不合理的。

为了处理这个问题,Core Data 供给了 constraints:我们可以指n + U w定某个特色被捆绑,以便它总是仅有的。然后我们就可以构建任意多的方针,在我们央求 Core2 j x [ C Data 保存那些方针时,它会处理重复,保证只需一份数据被写入。更好的是,= 6 ~ ; )假如已经存储) – m # u q某些数据和捆绑冲突,我们可以选择怎么处理数据吞并。

作为检验,我们可以创建一个新的实体,叫 Wizard,包含一个叫 “name” 的字符串特色。选择 Wizard 实体,查看数据模型监视器里的 Constraints,然后点击下面的 + 按钮。你应该会看到呈现了一行 “comF ; n l ^ N | 4 wma,separaw l b R & [ c i Oted,properk 5 | h 0 g h Ities”,这给了我们一个作业范本。选择这一行,然后点w f 9 p击 enter 重命名它,给它 “name” 的文本 —— 这样就要求我们的 name 特色必须是仅有的。改动之后记得点 Cmd+S 保存L G R = 6

现在,回到 ContentView.swift,供给下面的代码:

st - _ruct Cy ~ , 5 ~ontentView: View {
@Environment(.managedObjectContext) var moc
@FetchRequesD d 4 . g P S  pt(entity: Wizard.entity(), sortDescriptors: []) var wizards: FetchedResults<Wizard>
var body: s~ g # t d Iome View {
VStack {
List(wizards, id( V K Z Z ^: .self) { w{ A t = V : s Z Nizard in
Text(wizard.name ?? "Unknown")
}
Button("Add") {
let wizard = Wizard(context: self.moc)
wizard.name = "Harry Potter"
}
Button("Save") {
do {
try self.moc.sH W T  5 i gave()
} caV g f ; x i = 3tch {
print(error.localizedDescription)
}
}
}
}
}

8 / e 3 8 ( e会看到一张闪现巫师的清单,以及一e H ~ Y g f X r E个添加巫师的| ` t按钮,一个保存的按钮。但你工作使用,你会发现你可以多次点击按钮,多个 “Harry Potter” 滑入表格,可是当你点击 “Save” 时,咱b q 8 ) G C们会遭受一个错误 —— Core Data 检测到冲突,拒绝保存改变。

假如你确实希望 Core Data 写入这些改变,你需要翻开 SceneD# C / relegate.swift 添加下面2 } h 5 e P这行导入:

import CoreData

然后在willConnectTo办法中添加下面这样,在let contextu N J行后边:

context.mergePolicy = NSMergeByPropertyObjectT@ A : * @ m 2rumpMergePolicy

这会J ) ; 5 y U Q ( )要求 Core Data% N G P ( a f g 基于方针的特色来吞并重复的方针 —— 它会用新版本方针的特色智能地掩盖旧版本方针的特色。再次工作使用,现在你可以添加任意多次,不过点下保存按钮时,全部的行会坍缩成一行,因为 Core Data 剔除了全部的重复。

我的大众号 这里有Swift及计算机编程的相关文章,以及优异国外文章翻译,欢迎注重~

[SwiftUI 100天] 条件化保存 NSManagedObjectContext

发表评论

提供最优质的资源集合

立即查看 了解详情