2017-01-13 5 views
0

Ich habe eine Frage: wie man richtig ein solches Szenario mit RxDataSources in Rx-Weg zu implementieren:RxSwift und UICollectionView, UITableView

Wir mit UICollectionView eine Klasse (oder UITableView, es ist Sammlung Ansicht in meinem Fall), die Ergebnisse sind nicht sofort vorhanden, sie kommen nach einiger Zeit asynchron.

Ich habe mein Modell mit Abschnitten nach dem Tutorial hier umgesetzt: https://github.com/RxSwiftCommunity/RxDataSources

Aber die Daten nur einmal mit just dort erstellt:

let sections = [ 
    SectionOfCustomData(header: "First section", items: [CustomData(anInt: 0, aString: "zero", aCGPoint: CGPoint.zero), CustomData(anInt: 1, aString: "one", aCGPoint: CGPoint(x: 1, y: 1)) ]), 
    SectionOfCustomData(header: "Second section", items: [CustomData(anInt: 2, aString: "two", aCGPoint: CGPoint(x: 2, y: 2)), CustomData(anInt: 3, aString: "three", aCGPoint: CGPoint(x: 3, y: 3)) ]) 
] 

Observable.just(sections) 
    .bindTo(collectionView.rx.items(dataSource: dataSource)) 
    .addDisposableTo(disposeBag) 

Was zu tun, falls meine Artikel sind verfügbar nach einiger zeit und ich möchte meine sammlung ansicht automatisch aktualisiert werden?

Danke für jede Hilfe.

Antwort

6

können Sie Variable<[Section]> wie folgt verwenden:

enum Api { 
    /// Network response 
    static func call() -> Observable<[CustomData]> { 
     return .just([CustomData(anInt: 0)]) 
    } 
} 

struct CustomData { 
    let anInt: Int 
} 

class ViewController: UIViewController { 

    @IBOutlet weak var tableView: UITableView! 

    typealias Section = SectionModel<String, CustomData> 
    private let sections = Variable<[Section]>([]) 
    private let dataSource = RxTableViewSectionedReloadDataSource<Section>() 
    let disposeBag = DisposeBag() 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     // change sections by api call 
     Api.call() 
      .map { (customDatas) -> [Section] in 
       [Section(model: "First section", items: customDatas)] 
      }.bindTo(sections) 
      .addDisposableTo(disposeBag) 

     sections.asDriver() 
      .drive(tableView.rx.items(dataSource: dataSource)) 
      .addDisposableTo(disposeBag) 

    } 

    @IBAction func removeLastTableViewSection() { 
     // or you can change the sections manually. 
     sections.value.removeLast() 
    } 
} 

Die Benutzeroberfläche wird automatisch aktualisiert, wenn Sie sections.value ändern.

Hoffe, das kann Ihnen helfen.

+0

Vielen Dank! Mit Variable funktioniert es perfekt :) – jonaszmclaren

+0

@ beeth0ven Kannst du mir bitte helfen in ähnlicher Ausgabe [hier] (http://stackoverflow.com/questions/42744360/observable-array-to-any-array) Ich weiß nicht wie um dieses Observable zu konvertieren, wie Sie in der Call-Funktion erwähnt haben. –

+0

Die Verwendung einer 'Variable' ist keine besonders reaktive Lösung des Problems, da Sie jetzt wieder eine zustandsbehaftete Umgebung erstellt haben. Besser ein "tap" -Ereignis zu hören und die 'sections' -Variable entsprechend zu definieren. – RamwiseMatt

Verwandte Themen