领域和 Swift - 为要更新的模型传递的参数
Realm and Swift - parameters to pass for the model to be updated
在项目开始的时候,Realm很好用,而且项目越来越复杂,所以我需要弄清楚如何将realm层和uiviewcontroller解耦。
编写带参数的领域对象有些尴尬。我想用参数更新对象,然后传递给领域数据库以更新 (table?) 中的对象。最初,我有一个函数可以通过 -
编写一个领域对象
func createOrUpdateNote(note : Note, body : String, textSize : Float, toggleColor : Int) {
let realm = try! Realm()
do {
try realm.write {
if note.id == -1 {
note.id = NoteManager.createNotePrimaryId()
}
note.body = body
note.textSize = textSize
note.toggleColor = toggleColor
realm.add(note, update: true)
}
}
catch {
print(error.localizedDescription)
}
}
我想拥有这个功能。希望它能解决我的问题。
func createOrUpdateNote(note : Note) {
let realm = try! Realm()
do {
try realm.write {
realm.add(note, update: true)
}
}
catch {
print(error.localizedDescription)
}
}
现在我有另一个 viewcontroller 可以根据他们使用以下语言的偏好来更新对象。
func createOrUpdateNote(note : Note, language : String) {
let realm = try! Realm()
do {
try realm.write {
if note.id == -1 {
note.id = NoteManager.createNotePrimaryId()
}
note.language = language
realm.add(note, update: true)
}
}
catch {
print(error.localizedDescription)
}
}
数据库层将有两个相似的函数(dup 函数),当项目获得更多功能时它们将无法正常工作,所以我退后一步看看是否可以重新设计创建或更新对象方法.
我用谷歌搜索,有几种解决方案,比如制作 UI 对象,并在每次执行 CRUD 时将 ui 值复制到领域对象,使用内部领域对象创建对象(1 到 1映射),或者我正在考虑部分更新但不确定如何处理这种情况。理想情况下,我宁愿只保留要更新的对象。有什么建议吗?
如果您有一个现有的(托管的)Realm 对象,则只能在写入块中修改其属性。但是,它的任何属性都可以修改,而且您实际上只需要一个方块 'style' 即可。
例如,如果我们有一个 Note Realm 对象
Note: Object {
@objc dynamic var body = ""
@objc dynamic var textSize = 12
@objc dynamic var language = "English"
}
只要我们有权访问该 Note,我们就可以在写闭包中修改它的属性。假设用户正在编辑现有笔记并更改正文,然后单击“保存”。
let realm = try Realm()
try! realm.write {
myNote.body = updatedBodyText
realm.add(myNote, update: true)
}
或者他们更改文字大小
let realm = try Realm()
try! realm.write {
myNote.textSize = updatedTextSize
realm.add(myNote, update: true)
}
请注意,这些块是相同的,除了 属性 已更新。关键是在加载时挂起对笔记的引用,这样您就可以在保存时在写入块中修改它的属性。
根据您要保存的 属性 ,拥有多个写入块没有问题。这实际上取决于您的用例,但这是常见的做法。
一般来说也可以合为一个函数,像这样:
func saveMyNote(myNote: NoteClass, updatedData: String, fieldType: NoteFieldTypes) {
try! realm.write {
switch fieldType:
case .body:
myNote.body = updatedData
case .language:
myNote.language = updatedData
etc etc
realm.add(myNote, update: true)
}
您还可以扩展 class 或各种其他解决方案。一般来说,编写代码非常小,我会在需要更新对象字段的任何地方使用它。
在项目开始的时候,Realm很好用,而且项目越来越复杂,所以我需要弄清楚如何将realm层和uiviewcontroller解耦。
编写带参数的领域对象有些尴尬。我想用参数更新对象,然后传递给领域数据库以更新 (table?) 中的对象。最初,我有一个函数可以通过 -
编写一个领域对象func createOrUpdateNote(note : Note, body : String, textSize : Float, toggleColor : Int) {
let realm = try! Realm()
do {
try realm.write {
if note.id == -1 {
note.id = NoteManager.createNotePrimaryId()
}
note.body = body
note.textSize = textSize
note.toggleColor = toggleColor
realm.add(note, update: true)
}
}
catch {
print(error.localizedDescription)
}
}
我想拥有这个功能。希望它能解决我的问题。
func createOrUpdateNote(note : Note) {
let realm = try! Realm()
do {
try realm.write {
realm.add(note, update: true)
}
}
catch {
print(error.localizedDescription)
}
}
现在我有另一个 viewcontroller 可以根据他们使用以下语言的偏好来更新对象。
func createOrUpdateNote(note : Note, language : String) {
let realm = try! Realm()
do {
try realm.write {
if note.id == -1 {
note.id = NoteManager.createNotePrimaryId()
}
note.language = language
realm.add(note, update: true)
}
}
catch {
print(error.localizedDescription)
}
}
数据库层将有两个相似的函数(dup 函数),当项目获得更多功能时它们将无法正常工作,所以我退后一步看看是否可以重新设计创建或更新对象方法.
我用谷歌搜索,有几种解决方案,比如制作 UI 对象,并在每次执行 CRUD 时将 ui 值复制到领域对象,使用内部领域对象创建对象(1 到 1映射),或者我正在考虑部分更新但不确定如何处理这种情况。理想情况下,我宁愿只保留要更新的对象。有什么建议吗?
如果您有一个现有的(托管的)Realm 对象,则只能在写入块中修改其属性。但是,它的任何属性都可以修改,而且您实际上只需要一个方块 'style' 即可。
例如,如果我们有一个 Note Realm 对象
Note: Object {
@objc dynamic var body = ""
@objc dynamic var textSize = 12
@objc dynamic var language = "English"
}
只要我们有权访问该 Note,我们就可以在写闭包中修改它的属性。假设用户正在编辑现有笔记并更改正文,然后单击“保存”。
let realm = try Realm()
try! realm.write {
myNote.body = updatedBodyText
realm.add(myNote, update: true)
}
或者他们更改文字大小
let realm = try Realm()
try! realm.write {
myNote.textSize = updatedTextSize
realm.add(myNote, update: true)
}
请注意,这些块是相同的,除了 属性 已更新。关键是在加载时挂起对笔记的引用,这样您就可以在保存时在写入块中修改它的属性。
根据您要保存的 属性 ,拥有多个写入块没有问题。这实际上取决于您的用例,但这是常见的做法。
一般来说也可以合为一个函数,像这样:
func saveMyNote(myNote: NoteClass, updatedData: String, fieldType: NoteFieldTypes) {
try! realm.write {
switch fieldType:
case .body:
myNote.body = updatedData
case .language:
myNote.language = updatedData
etc etc
realm.add(myNote, update: true)
}
您还可以扩展 class 或各种其他解决方案。一般来说,编写代码非常小,我会在需要更新对象字段的任何地方使用它。