我应该将我的 UserDefaults 保存过程放入 ViewModel 中吗? (好的架构)
Should I put my UserDefaults saving process into ViewModel? (good architecture)
我正在创建一个简单的 NewsApp。我想创建我能做的最好的应用程序架构。所以我的问题是,如果我想将非常简单的数据(如用户名和 5-6 个标签)保存为字符串,我应该将 userDefaults 逻辑放入我的 viewModel 还是应该在 ViewModel 和 UserDefaultsAPI 之间创建一个层来负责保存数据?
我的意思是我将创建 UserDefaultsAPI 将实施的 StoreData 协议。如果我应该这样做,我该如何实现?我正在使用 RxSwift,我现在不知道如何通过 UserDefaultsAPI 订阅 UserDefaults 中的更改数据。
你应该在两者之间创建一个层,但是给定一个 Rx/functional 架构,它不应该是像协议这样的重量级的东西。
学习 How to Control the World 并改为执行以下操作:
struct Storage {
static var shared = Storage()
var saveProperty: (Property) -> Void = { property in
UserDefaults.standard.set(try? JSONEncoder().encode(property), forKey: "property")
}
var deleteProperty: () -> Void = {
UserDefaults.standard.removeObject(forKey: "property")
}
var currentProperty: () -> Observable<Property?> = {
UserDefaults.standard.rx.observe(Data.self, "property")
.map { [=10=].flatMap { try? JSONDecoder().decode(Property.self, from: [=10=]) } }
.distinctUntilChanged()
}
}
struct Property: Codable, Equatable { }
这取决于你创建一个单独的层能为你做什么,拥有实现相同协议的不同数据源的机会可能很有用,而且你的数据可能是复杂的类型,不需要编码和解码,所以封装它是有意义的,你可能还想为你的一些值提供一些限制范围,但 UserDefaults 只是一个像 NotificationCenter 这样的服务,你不会自动包装 NotificationCenter class,只是做什么是最简单的,但 运行 以后没有把自己画在角落里的风险。你不会在开始时就决定每一个问题,技巧是确保你可以在需要时快速改变,并了解你将来需要利用什么可能性以及如何避免需要在不增加下蹲的那一刻做出复杂的改变。您需要做很多事情,并且能够确定它们的优先级是您所做工作的重要组成部分,不要尝试进行切肉刀设计,切肉刀设计使其易于其他人理解和修改。
我正在创建一个简单的 NewsApp。我想创建我能做的最好的应用程序架构。所以我的问题是,如果我想将非常简单的数据(如用户名和 5-6 个标签)保存为字符串,我应该将 userDefaults 逻辑放入我的 viewModel 还是应该在 ViewModel 和 UserDefaultsAPI 之间创建一个层来负责保存数据?
我的意思是我将创建 UserDefaultsAPI 将实施的 StoreData 协议。如果我应该这样做,我该如何实现?我正在使用 RxSwift,我现在不知道如何通过 UserDefaultsAPI 订阅 UserDefaults 中的更改数据。
你应该在两者之间创建一个层,但是给定一个 Rx/functional 架构,它不应该是像协议这样的重量级的东西。
学习 How to Control the World 并改为执行以下操作:
struct Storage {
static var shared = Storage()
var saveProperty: (Property) -> Void = { property in
UserDefaults.standard.set(try? JSONEncoder().encode(property), forKey: "property")
}
var deleteProperty: () -> Void = {
UserDefaults.standard.removeObject(forKey: "property")
}
var currentProperty: () -> Observable<Property?> = {
UserDefaults.standard.rx.observe(Data.self, "property")
.map { [=10=].flatMap { try? JSONDecoder().decode(Property.self, from: [=10=]) } }
.distinctUntilChanged()
}
}
struct Property: Codable, Equatable { }
这取决于你创建一个单独的层能为你做什么,拥有实现相同协议的不同数据源的机会可能很有用,而且你的数据可能是复杂的类型,不需要编码和解码,所以封装它是有意义的,你可能还想为你的一些值提供一些限制范围,但 UserDefaults 只是一个像 NotificationCenter 这样的服务,你不会自动包装 NotificationCenter class,只是做什么是最简单的,但 运行 以后没有把自己画在角落里的风险。你不会在开始时就决定每一个问题,技巧是确保你可以在需要时快速改变,并了解你将来需要利用什么可能性以及如何避免需要在不增加下蹲的那一刻做出复杂的改变。您需要做很多事情,并且能够确定它们的优先级是您所做工作的重要组成部分,不要尝试进行切肉刀设计,切肉刀设计使其易于其他人理解和修改。