Using URLProtocol to Mock and Test

When writing unit tests for Swift networking code that uses URLSession we don’t want to perform real network requests. We want to mock responses so that our unit tests remain fast, predictable and independent. Mocking responses from URLSession can be done by wrapping it in a protocol and creating a mock session when testing. But an alternative way is using URLProtocol. What is URLProtocol? URLProtocol is a class that allows you to intercept and handle network requests, giving you the ability to implement features such as caching, redirects, or authentication....

February 1, 2023 · Mike Gopsill ·  Testing

Explaining Combine's Share and Connect with Examples

Apple’s Combine framework has two operators called .share() and .makeConnectable(). They are extremely useful but often misunderstood. Both help us avoid unnecessary processing. .share(), as the name suggests, helps us share a subscription. .makeConnectable() helps control when publishers emit events. Working with Multiple Subscribers Imagine you have a simple view with a button and two labels. When a user taps the button, the text on the two labels will be updated....

January 29, 2023 · Mike Gopsill ·  Combine

Swift Combine's Future and Deferred Explained

Future Combine provides the Future publisher class to model a single asynchronous event. The Future acts like a promise. It can either fulfil its promise or fail to fulfil its promise. Those familiar with promises from frameworks like PromiseKit might liken Future to a promise. The added benefit of using Future is that it is a publisher, so you can use them with operators and subscribers and easily integrate them into combine data streams....

January 25, 2023 · Mike Gopsill ·  Combine

Swift Combine Publishers: An Overview

In this post, we will look at the Publisher protocol in Swift’s Combine framework. What is it? Why is it? 🤔 Why does Publisher exist? Combine is swift’s reactive programming framework. A reactive programming framework works with streams of data emitted over time. Combine needs something that can model a data stream. This is the role of the Publisher protocol. The protocol looks like this: protocol Publisher<Output, Failure> For the protocol to model a data stream it needs to allow for three things:...

January 21, 2023 · Mike Gopsill ·  Combine

Creating a Text Publisher from UISearchBar in Combine

So you have a UISearchBar like the one shown below. A user typing into a search bar is an ideal input data stream for Combine. Ideally, we’d access a string publisher based on user input like so. let searchBar = UISearchBar() let searchText = searchBar.textPublisher Alas, it does not exist. I also tried performing Key-Value Observing with Combine on the searchBar or its text field. searchBar.publisher(for: \.text) searchBar.searchTextField.publisher(for: \.text) It compiles but emits no events....

Reactive Programming with Swift and Combine

Data Streams Reactive programming is programming with asynchronous data streams This is useful because anything can be represented as a stream of data, including user input, network responses, and even internal program state. By treating everything as a stream, it becomes possible to use a single set of abstractions to handle all types of data, making it simpler to reason about and manage the flow of data through an application....

January 15, 2023 · Mike Gopsill ·  Combine