2017-02-17 96 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它應該是可能的通過添加通知塊在領域的結果,而不是領域(因爲領域的結果只是數據有意義?),至少這就是爲什麼我試圖實現 –