Debug logging with CombinePrintout
Logging is a really powerful way to debug code, especially if it’s asynchronous code that runs in a time sensitive way so stepping through the debugger is a pain.
In Simple custom Combine operators I wrote about how to create an operator that logs to the system Console app in just few lines.
After playing with Combine some more I went ahead and created a micro framework called “CombinePrintout” that adds few convenient methods to Combine allowing you to quickly print information about your subscriptions.
To use CombinePrintout in your Xcode project go to “File > Swift Packages > Add Package Dependency…” and enter the package URL:
The package allows you to easily print information about your subscriptions and cancellables.
Printing subscription info
print() operator is pretty useful but while you’re debugging code sometimes you need to subscribe given publisher for the only purpose of printing what’s being emitted and when the publisher completes.
CombinePrintout adds a new subscriber called
printSink(), which is … no surprise here … a sink that only prints all events to the console.
You use it like so:
printSink() will subscribe the publisher and log all events like so:
If you are logging multiple subscriptions (especially if they run concurrently) you might want to use an identifier for each like so:
This will print the identifier alongside the rest of the output:
Here’s an Xcode tip for when you are heavily logging in your code: Use the Xcode Console filter field to filter your app’s log in real time:
Printing cancellable info
Another API in CombinePrintout is
printCancellable(). This method wraps a
Cancellable and prints its life-cycle events.
This could help you figure the precise time when your subscription’s cancellable is created, cancelled, and released from memory.
You use it like so:
printCancellable() is not an operator that you call on your publisher. It instead is a method on
Cancellable you get back from a subscriber like
assign(to:on:) in the code above.
The result of
printCancellable() is also an
AnyCancellable so you can go on and store it in an
[AnyCancellable] collection or a property somewhere.
The result in the console looks like this:
Just like with
printSink() you can add an
id parameter to identify the logs in your Console.
And that’s a wrap - these are the two publicly available APIs in CombinePrintout. I hope they will help you along the way!
Where to go from here?
Grab the source or add the package as a dependency from the public repo on GitHub:
To learn more about debugging with Combine check out the debugging chapter in Combine: Asynchronous programming with Swift - this is where you can see all updates, discuss in the website forums, and more.