我尝试使用Realm和Alamofire将项目重构为MVVM模式。
我没有找到准确回答我应该在哪里进行API调用以及必须使用Realm将数据写入数据库的地方。我的猜测是'应该在模型中。
示例,我想显示用户个人资料。这个例子是正确的,我应该在哪里进行API调用?我的问题是我需要为服务和模型创建许多静态/类功能,我不能使用自动更新结果。
// Model
class User: Object {
class function get(whereIdentifier identifier: Int) {
let realm = try! Realm()
let predicate = NSPredicate(format: "identifier = %d", identifier)
return realm.objects(Runner.self).filter(predicate).first
}
}
// ViewModel
struct UserViewModel {
init(user userModel: User) {
}
static func get(whereIdentifier identifier: Int) -> UserViewmodel? {
// Return a UserViewModel to show on the ViewController
}
}
// I got a service like
struct UserService: Networkable {
func get(whereUser user: User, completionHandler: @escaping (Result<User>) -> Void) {
// Return a user from API
}
}
// I got a service like
struct UserService: Networkable {
func get(whereUser user: User, completionHandler: @escaping (Result<User>) -> Void) {
// Return a user from API
}
}
答案 0 :(得分:2)
我们已经通过这种方式解决了这个问题。
User.get
方法的抽象)来创建适当的Realm对象并在Realm中创建/更新/删除它们。我们使用ObjectMapper来处理每个模型对象中的映射realm.notifications
订阅因API响应而发生的任何更改。它看起来像这样(半伪代码):
var users:Results<User> = DataManager.shared.objects(User.self, whereIdentifier: id)
notificationToken = realm.addNotificationBlock { [weak self] (notification, realm) in
self?.updateViewModel()
}
updateViewModel()
APIManager.shared.loadUser(id: id)
func updateViewModel() {
//parse users data into whatever format you need for your VM
}