-
Sep 4, 2016
Minimal iOS MVVM and RxSwift
There are a lot of great examples out there on how to implement the MVVM pattern for iOS Applications. In a lot of those examples the idea behind MVVM is deeply connected to Reactive Programming. They often become more of an RxSwift or ReactiveCocoa showcase than an easy to follow MVVM example even though MVVM can be perfectly used without any Reactive Programming frameworks.
In the end, the ViewModel needs to signal the View to update its state. This is a perfect use case for RxSwift/Reactive Cocoa but can also be done using the delegate pattern or even KVO. In this post I’m showing an incredible lightweight RxSwift connection with a ViewModel used in a TableViewController. Maybe it can give an easy to understand starting point for using Reactive Programming and MVVM in iOS development.
Bring the code
Let’s first define the data that it used by the ViewModel to signal a content-change to the TableViewController:
enum UpdateState { case initial case insert(indexPath: IndexPath) case update(indexPath: IndexPath) case delete(indexPath: IndexPath) }The ViewModel knows about the actual models, when they are inserted, updated or got deleted. It uses the
Changeenum to communicate the type of change that happened at a specificIndexPath. A simplified implementation of a ViewModel can look like this:class ViewControllerViewModel { private var data: [...] = [] private let modelChangeSubject = BehaviorSubject<UpdateState>(value: .initial) var modelChange: Observable<UpdateState> { return modelChangeSubject.asObservable() } func insert(...) { //Save new model and determine indexPath ... modelChangeSubject.onNext(.insert(indexPath: indexPath)) } func update(...) { //Update model ... modelChangeSubject.onNext(.update(indexPath: indexPath)) } func delete(...) { //Delete model ... modelChangeSubject.onNext(.delete(indexPath: IndexPath(forRow: row, inSection: 0))) } func numberOrRows() -> Int { return data.count } func titleForIndexPath(indexPath: IndexPath) -> String? { return data[indexPath.row].description } }The ViewModel exposes an
Observable. The TableViewController uses this variable to subscribe to updates from the ViewModel. Privately theObservableis created through anBehaviourSubject.Subjectsare anObserverandObservableat the same time. The ViewModel only exposes theOberserverrepresentation of the subject so that the TableViewController is not allowed to also send updates itself.The
Observableis now used in the TableViewController to update the TableView according to changes in the ViewModel:let _ = viewModel.modelChange.subscribe(onNext: { (state) in switch state { case .insert(let indexPath): self.tableView.insertRows(at: [indexPath], with: .automatic) self.tableView.scrollToRow(at: indexPath, at: .top, animated: true) case .update(let indexPath): self.tableView.reloadRows(at: [indexPath], with: .automatic) case .delete(let indexPath): self.tableView.deleteRows(at: [indexPath], with: .automatic) default: return } })The TableViewController will use the ViewModel again in
numberOfRowsInSectionorcellForRowAt:indexPathto know what information should be displayed.This small example demonstrates how RxSwift can be used to connect a ViewModel and an actual ViewController. I highly suggest to read up the RxSwift documentation to get and understanding on how powerful Reactive Programming is and what to consider about memory management.
-
Aug 22, 2016
Wäre ich ein Fashionblogger würde ich nun berichten, wie sehr ich meine neuen Nike SB Janoski Max liebe. Bin ich nicht, daher gibt es nur diese Status-Post.
-
Aug 21, 2016
Die ganze Jekyll-Migartion läuft bisher viel besser ab als ich es erwartet hatte. Git-Deploy funktioniert auch schon. 👍
-
Aug 20, 2016
Jekyll
Ich verfolge nun schon seit längerer Zeit die Entwicklung von Jekyll und habe nun endlich damit begonnen auch meinen Blog damit zu betreiben. Es gibt noch viel zu tun, ich wollte aber die Seite so schnell wie möglich damit online nehmen.
-
Jul 28, 2016
Mulholland Drive: How Lynch Manipulates You
Was für ein ausgezeichnetes Video zu einem meiner Lieblingsfilme. Der ganze Youtube-Kanal ist außerdem empfehlenswert.
-
Jul 20, 2016
Pre-announcing Snippets.today - manton.org
Ich bin sehr auf das Projekt gespannt, da ich ja auch hier ab und an versuche, einen Mikro-Blog zu führen. Vielleicht motiviert es mich mehr, wenn mit Snippets.today ein größerer sozialer Aspekt ins Spiel kommt.
-
Jun 26, 2016
ILA 2016
Mittlerweile ist es nun schon ein paar Wochen her, aber dieses Jahr besuchten wir zum ersten Mal die ILA (1.-4. Juni 2016) hier in Berlin. Dies war einer meiner Kindheitswünsche und nachdem man hier gleich wohnt, kann man ja schonmal hingehen.
Die Anfahrt zum Schönefelder Flughafen war mit ca. einer Stunde relativ langwierig. Dies ist auch ein Grund, warum ich mich nicht sonderlich auf den neuen Hauptstadtflughafen freue. Leider konnten wir lediglich am Samstag die Ausstellung besuchen und wurden bei der Ankunft um 10:00 Uhr von einer enormen Schlange am Tickethäuschen überrascht. Zum Glück konnten wir online über das iPhone noch zwei Tickets kaufen um die erste große Schlange zu überspringen.
Auf dem riesigen Messegelände angekommen, sind wir gleich aufs Rollfeld gegangen und haben uns die ganzen Flugzeuge von nahem angesehen. Gelegentlich ist das ein oder andere, auch historische Flugzeug, über uns vorbei geflogen. Es war unglaublich heiß an diesem Samstag und Schatten war nur unter den riesigen Tragflächen einiger Militär-Transportmaschinen zu finden.

In den Hallen interessierte ich mich noch für die ganzen Raumfahrt-Stände. Leider waren diese oft nicht für normale Besucher ausgelegt und daher eher langweilig.
Im Großen kann ich es aber nur empfehlen, wenn man sich für Flugzeuge interessiert und die Karten vorher online kauft.
-
May 28, 2016
Swift and Dynamism
Wil Shipley:
I am better Swift programmer after a year and a half in Swift than I was in Objective-C after 26 years.
Wahrscheinlich der einzige Post zu welchem ich in dieser ganzen Dynamism-Debatte verlinke.
-
May 10, 2016
CocoaPods 1.0
Ein riesiger Meilenstein für CocoaPods und die Open Source iOS- und Mac-Entwicklercommunity. Ich bin noch immer ein großer CocoaPods-Fan!
-
May 8, 2016
WWDC 2016 Attendee List and Slack
Die bekannte WWDC-Besucherliste von Adam Swinden ist zurück. Diesmal bin auch ich eingetragen!
-
May 1, 2016
DayOneToMarkdownFiles
Seit dem Erscheinen von Day One 2 hat es mit immer mehr verärgert, dass der Dropbox-Sync weggefallen ist, und der hauseigene Service verwendet werden muss. Ich verstehe, warum Day One diesen Schritt ging, allerdings gefällt es mir nicht, dass meine persönlichsten Notizen auf einem fremden Server liegen und ich nicht direkt Zugriff auf die Dateien habe.
Ich habe mir somit ein kleines Swift Tool geschrieben, welches die im JSON-Format exportierten Day One Einträge in Markdown-Dateien ablegt. Die Bilder werden dabei mit sinnvolleren Dateinamen umbenannt und als Markdown-Bild verlinkt. Ich übernehme lediglich die Wetter- und Ortsinformationen mit in die Markdown-Datei, da mich die anderen Informationen nicht wirklich interessieren.
Ich verwende jetzt Editorial/Ulysses und einen Ordner in Dropbox zum Führen des Tagebuchs.
-
Apr 9, 2016
CRS-8 | First Stage Landing on Droneship
Eine riesige Rakete auf einem Schlauchboot zu landen sieht in diesem Video fast schon zu einfach aus. Großartige Leistung von SpaceX!
-
Apr 7, 2016
Rogue One Teaser
Ah, es gefällt mir sehr sehr gut in welche Richtung sich mein Lieblings-Franchise entwickelt! Irgendwann können wir die Prequels komplett verdrängen…
-
Apr 2, 2016
Tesla Model 3
Model 3 combines real world range, performance, safety and spaciousness into a premium sedan that only Tesla can build. Our most affordable car yet, Model 3 achieves 215 miles of range per charge while starting at only $35,000 before incentives. Model 3 is designed to attain the highest safety ratings in every category.
Das Model 3 ist wirklich ein schönes Auto mit einem Preis, der scheint als sei er zu gut um wahr zu sein. Nur die Reichweite sehe ich für mich noch als ein Problem, da der einzige Grund warum ich ein Auto bräuchte, Langstreckenfahrten sind.
-
Mar 29, 2016
My Heroic and Lazy Stand Against IFTTT
It’s entirely IFTTT’s decision to drop support for Pinboard (along with a bunch of other sites). They are the ones who are going to flip the switch on working code on April 4, and they could just as easily flip the switch back on (or even write an IFTTT recipe that does it for them). Weigh their claims about Pinboard being a beloved service accordingly.
Ich verwende IFTTT hauptsächlich um alle möglichen Sachen in Day One zu spiegeln. Hoffentlich kommt bald eine öffentliche Day One API, so dass ich nicht mehr auf IFTTT angewiesen bin.