The Blog

Catch vs replaceError in Combine

There are several ways to handle errors in Combine. Most commonly you will either use catch or replaceError if you want to implement a mechanism that allows you to recover from an error. For example, catch is useful if you want to retry a network operation with a delay. The catch and replaceError operators look very similar at first glance. They are both executed when an error occurs in your pipeline, and they allow you to recover from an error. Read more…

Retrying a network request with a delay in Combine

Combine comes with a handy retry operator that allows developers to retry an operation that failed. This is most typically used to retry a failed network request. As soon as the network request fails, the retry operator will resubscribe to the DataTaskPublisher, kicking off a new request hoping that the request will succeed this time. When you use retry, you can specify the number of times you want to retry the operation to avoid endlessly retrying a network request that Read more…

Reclaim disk space by deleting old iOS simulators and Device Support files

After using a MacBook that runs Xcode for a few years it’s likely that your disk space is starting to fill up good. A large part of this disk space can be occupied by Device Support files that are used by Xcode for older iOS versions, or by iOS simulators that are no longer available on your machine. To clean these files up you can do the following: Go to your Terminal and type open ~/Library/Developer/Xcode/iOS\ DeviceSupport Delete folders for Read more…

Throttle network speeds for a specific host in Charles

Sometimes you’ll want to test whether your app works properly under poor networking conditions. One way to test this is Apple’s Network Link Conditioner. Unfortunately, this will slow internet speeds for your entire machine to a crawl which can be counterproductive. Especially if you want to throttle your app for a longer period of time. If you have Charles installed to debug your app’s network traffic, you can use it to throttle network speeds for the entire system, or for Read more…

How to have more than one type of cell in a Collection View

Collection views in iOS are awesome. You can use them to build complex custom layouts and since iOS 13 you can use Compositional Layouts to quickly build good looking layouts that would take forever to accomplish on iOS 12 and below. But what if you want to use more than one type of cell in your layout? If you’re building your app without storyboard you register collection view cells using the register method on UICollectionView. If you want to use Read more…

Understanding type erasure in Swift

Swift’s type system is (mostly) fantastic. Its tight constraints and flexible generics allow developers to express complicated concepts in an extremely safe manner because the Swift compiler will detect and flag any inconsistencies within the types in your program. While this is great most of the time, there are times where Swift’s strict typing gets in the way of what we’re trying to build. This is especially true if you’re working on code that involves protocols and generics. With protocols Read more…

Getting started with testing your Combine code

A question that often comes up when folks get into learning Combine is “how do I test code that uses Combine?”. In this week’s post, I will briefly explain the basics of testing Combine code. I will assume that you already know the basics of testing and Combine. If you’re just getting started with both topics or would like a refresher I can recommend that you take a look at the following resources: My series of posts on testing My Read more…

Creating type-safe identifiers for your Codable models

Note: After publishing this article, it has been brought to my attention that the folks from @pointfreeco have a very similar solution for the problems I outline in this post. It’s called tagged and implements the same features I cover in this post with several useful extensions. If you like this post and plan to use the concepts I describe, you should take a look at tagged. It seems that on the Swift forums, there are a couple of topics Read more…

Why your @Atomic property wrapper doesn’t work for collection types

A while ago I implemented my first property wrapper in a code base I work on. I implemented an @Atomic property wrapper to make access to certain properties thread-safe by synchronizing read and write access to these properties using a dispatch queue. There are a ton of examples on the web that explain these property wrappers, how they can be used and why it’s awesome. To my surprise, I found out that most, if not all of these property wrappers Read more…

Changing a publisher’s Failure type in Combine

One of Combine’s somewhat painful to work with features is its error mechanism. In Combine, publishers have an Output type and a Failure type. The Output represents the values that a publisher can emit, the Failure represents the errors that a publisher can emit. This is really convenient because you know exactly what to expect from a publisher you subscribe to. But what happens when you have a slightly more complicated setup? What happens if you want to transform a Read more…