2017-02-17 98 views
1

我想重构项目使用Realm和Alamofire的MVVM模式。使用领域和服务使用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 
    } 
} 

回答

2

我们已经用这种方式处理了这个问题。

  1. 的视图控制器,使我们的APIManager
  2. 的APIManager负责制定与Alamofire API调用和读取JSON响应的请求。它调用我们的DataManager(这是您的User.get方法的抽象)来创建相应的Realm对象并在Realm中创建/更新/删除它们。我们使用ObjectMapper处理每个模型对象中的映射。
  3. ViewController还从我们的DataManager中创建一个自动查询对象。
  4. ViewController还订阅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 
} 
+0

嗯,这是我的想法之一,但因为视图参考模型(事实上领域对象,但它是它不是纯MVVM同样的权利?)_ViewController也从我们的DataManager中创建一个自动化查询对象。并且它意味着在项目中的任何地方都有很多对RealmSwift的引用。无论如何感谢您的回答。 – Ludovic

+0

而不是查看API调用的工作;恕我直言! – Ludovic

+0

@Ludovic imo它应该是可能的通过添加通知块在领域的结果,而不是领域(因为领域的结果只是数据有意义?),至少这就是为什么我试图实现 –