2015-12-08 11 views
5

Dire che ho il seguente SwiftRx (2.0.0-beta.4) MVVM situazione:RxSwift MVVM Come impostare View Model With Item Manager?

Ho 4 cose:

  • ItemListViewController
  • ItemsViewModel
  • ItemsManager
  • Articolo

ItemsManager ha una funzione chiamata elementi() che restituirà gli articoli in un modo RxSwift osservabile.

ItemsViewModel ha solo bisogno di passare gli articoli per ora. Successivamente, è possibile applicare la logica di visualizzazione su un attributo Articolo per il controllo del View Controller (come visualizzare correttamente una data).

ItemListViewController inserisce gli elementi in una tabella, un articolo per riga.

Un elemento ha 4 attributi (come un identificativo, data, ...) che verranno visualizzati nella cella della riga della tabella.

Come impostarlo in ItemsViewModel e ItemsManager in modo che quando gli articoli vengono aggiunti, rimossi, modificati nel gestore che passano attraverso ItemsViewModel?

Dalla lettura del documentation e guardando la Rx.playground, sembra che la cosa da utilizzare per il momento è un RxSwift PublishSubject < Articolo> o forse un RxSwift mappa che è in qualche modo sottoscritto oggetti del gestore()

Come fare bene?

L'ItemsManager ha qualcosa di simile in questo momento:

func items() -> Observable<Item> { 
    // placeholder for now 
    return [Item(identification: "123", content: ""), Item(identification: "456", content:""), Item(identification: "789", content:"")].toObservable() 
} 

la vista del modello ha questo in esso:

let items = Variable(/* how to subsribe to the items in the manager? */) 

risposta

8

Una soluzione artificiosa aka qualcosa che dimostra un approccio generale ed è più semplice da capire è qui sotto:

import UIKit 
import RxSwift 
import RxCocoa 

struct Item { 

    let identification: String 
    let content: String 
} 

struct ItemsManager { 

    let items: Variable<[Item]> = Variable<[Item]>(
     [Item(identification: "some id1", content: "some content"), 
     Item(identification: "some id2", content: "some more content")] 
    ) 
} 

struct ItemsViewModel { 

    let itemsManager = ItemsManager() 

    let myItems:Observable<[String]> 

    init() { 

     myItems = itemsManager.items 
     .map({ someArrayOfItems in 
      return someArrayOfItems.map {$0.content } 
     }) 
    } 
} 

class ItemListViewController: UIViewController { 

    @IBOutlet weak var tableView: UITableView! 

    let itemsViewModel = ItemsViewModel() 

    let disposeBag = DisposeBag() 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     itemsViewModel.myItems 
      .bindTo(tableView.rx_itemsWithCellIdentifier("itemListCell")) { (row, element, cell) in 

       guard let myCell: UITableViewCell = cell else { 
        return 
       } 

       myCell.textLabel?.text = element 
      } 
      .addDisposableTo(disposeBag) 

    } 
} 
Problemi correlati