使用MVVM使用Realm和服务

时间:2017-02-17 07:43:33

标签: mvvm swift3 realm alamofire

我尝试使用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
     }
}

1 个答案:

答案 0 :(得分:2)

我们已经通过这种方式解决了这个问题。

  1. ViewController向我们的APIManager发出请求
  2. APIManager负责与Alamofire进行API调用并阅读JSON响应。它调用我们的DataManager(它是User.get方法的抽象)来创建适当的Realm对象并在Realm中创建/更新/删除它们。我们使用ObjectMapper来处理每个模型对象中的映射
  3. ViewController还会从我们的DataManager创建一个自动更新查询对象。
  4. ViewController还会为realm.notifications订阅因API响应而发生的任何更改。
  5. 它看起来像这样(半伪代码):

    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
    }