• 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 Change enum to communicate the type of change that happened at a specific IndexPath. 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 the Observable is created through an BehaviourSubject. Subjects are an Observer and Observable at the same time. The ViewModel only exposes the Oberserver representation of the subject so that the TableViewController is not allowed to also send updates itself.

    The Observable is 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 innumberOfRowsInSection or cellForRowAt:indexPath to 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.


  • 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.


  • Die ganze Jekyll-Migartion läuft bisher viel besser ab als ich es erwartet hatte. Git-Deploy funktioniert auch schon. 👍


  • 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.


  • Mulholland Drive: How Lynch Manipulates You

    Was für ein ausgezeichnetes Video zu einem meiner Lieblingsfilme. Der ganze Youtube-Kanal ist außerdem empfehlenswert.

    Quelle


  • 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.

    Quelle


  • 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.


  • 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.

    Quelle


  • 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!

    Quelle


  • WWDC 2016 Attendee List and Slack

    Die bekannte WWDC-Besucherliste von Adam Swinden ist zurück. Diesmal bin auch ich eingetragen!

    Quelle


  • 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.

    Quelle


  • 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!

    Quelle


  • 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…

    Quelle


  • 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.

    Quelle


  • 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.

    Quelle