In the last few articles, we’ve inspected different ways to control concurrency. There are some low-level basics provided by the operating system. For example, Apple provided frameworks or other ideas such as promises, which are highly used in JavaScript. Even though some pitfalls have been mentioned earlier I realized I didn’t give enough credit to them. As a result, trying to be comprehensive, some parts of this article are recaps.

This article is all about, what could possibly go wrong if you don’t understand concurrency. Let’s dive in!


Atomic contains has the same idea as a transaction in a database…

In 2016 Apple released SiriKit as a way for your apps to work with Siri. I was really excited because it created an entirely new way for the user to interact with their phone. They weren’t limited to touch (gestures, force, keyboard) anymore. Instead, they could finally use their voice with any app supporting it. It was then, while I was indulged in this idea, that I realized, this wasn’t the case. SiriKit usage was limited to 6 categories, namely:

  • Messaging
  • VoIP calling
  • Payment
  • Ride booking
  • Photo search
  • Workouts

This really sucked. I was bummed and didn’t look deeper into…

I’m currently in the process of switching companies. On my last day my team presented me with a card. Knowing my knack for riddles and brain teasers, they didn’t write a text directly onto the card, they “encrypted” it and wrote some code with higher order functions. This was the card:

While trying to decipher the code I learned a lot. As you can see it’s quite obvious the cypher used is just a simple Caesar shifted by the current weekday. It was supposed to work on a Thursday, but they screwed up a little bit and it ended…

Concurrency is getting more and more relevant in our daily work. In my last articles (Parallel programming with Swift: Basics, Operations), we have looked into tools Apple provides. This time, let’s look into something not officially supported.

Just to recap:

Concurrency is about the ability to do work at the same time.

Imagine having a long lasting task. It takes a while, and in the end, we get a result. This could be for example downloading a file. The result would be an image. At the same time, we know we will set this image to our UIImageView. …

Quality is a result of the tools we use. The more familiar we are with them, the better (or faster) will be the result. Of course we can achieve a lot with a minimal toolset, but to get more productive, we should always strive to master our current tools and find new ones which will improve our workflow. I'm always looking for new tools, so if you have any I don't use yet, please tell me.

Without further ado, here is my toolbox:

GUI Tools


Store your passwords and have them save. …

In the Parallel programming with Swift: Basics I’ve introduced a lot of low-level options to control concurrency within Swift. The original idea was to collect all different types of approaches we can use on iOS at one place. But while writing that guide I’ve realized there are way too many, to list them in one post. So I decided to cut down the higher level methods.

I did mention Operations in the last post, but let’s look into them more closely.


I've started this blog with an explanation of how to improve the quality within the app. On my way there we've encountered a lot of different types of testing. But how much of each type should we invest into our app? As always there is a balance to strike. This time it's about how much we can invest vs how much value it will create (isn't it always?). So let's have a detailed look.


We've looked quite a lot into unit tests. How to do it in Objective-C, in Swift and how we can test Apple's MVC (don't forget calling…

About a year ago my team started a new project. This time we wanted to use all our learning from prior projects. One of the decisions we’ve made was to make the entire model API asynchronous. This will allow us to change the entire implementation of the model, without affecting the rest of the app. If our app was able to handle asynchronous calls, it didn’t matter whether we were communicating with a backend, the cache or our database. It also enables us to work concurrently.

At the same time, it had some implications. As developers, we had to understand…

Long live Manual testing

Manual testing is still the most practiced kind of quality assurance. Even though developers created a lot of variations for automated testing, we are not able to get rid of it. In prior posts, we’ve looked into a lot of different types of automated testing. There were options to test small code units, the UI, the behavior and even testing with chaos. Considering all these different ways, why should we do manual testing?


We all know reasons not to do manual testing. I guess the most often used is: time consumption. A person sitting and executing a test takes maybe…

Mobile development is quite a new discipline compared to others like backend development. Since Apple didn't care about testing for a long time, the community started late with testing. In the beginning we had Unit-Testing tools, which I've looked into at Unit-Tests in Swift and Unit-Tests in Objective-C. Having unit tests is great, but as the name says, it's just testing units. So we kept on looking and found Golden Master Testing. Another great tool to improve our quality. Finally we could ensure our UI's to be correct. But does having a correct UI mean our app is doing what…

Jan Olbrich

iOS developer focused on quality and continuous delivery

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store