Apple Open Source SwiftNIO, a Low-Level Non-Blocking I/O Framework for Swift

| by Sergio De Simone Follow 7 Followers on Mar 04, 2018. Estimated reading time: 1 minute |

A note to our readers: You asked so we have developed a set of features that allow you to reduce the noise: you can get email and web notifications for topics you are interested in. Learn more about our new features.

At the recent try! Swift Conference in Tokyo, Apple announced the SwiftNIO project, a Netty-like non-blocking cross-platform I/O framework written in Swift.

SwiftNIO aims to be an asynchronous event-driven network framework for the development of high-performance servers and clients. It is currently developed and tested on macOS (10.12+) and Linux (Ubuntu 14.04). According to Apple:

SwiftNIO is a cross-platform asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients.

SwiftNIO aims to be a low-level tool to build networked applications and frameworks, focusing on providing low-overhead I/O primitives and protocol implementations. Accordingly, SwiftNIO can mostly be seen as a building block for higher-level networking communication frameworks that applications will use, or as an high-performance framework that applications with very demanding requirements can use directly. As a consequence of this approach, support for most networking protocols is implemented out-of-tree. According to Cory Benfield, one of the Apple engineers behind SwiftNIO, while the HTTP/1.1 protocol support is in tree, TLS support, Websocket, and HTTP/2 support is out-of-tree.

The basic abstraction provided by SwiftNIO is EventLoop: an object that waits for events and fires some callback when they happen. Ideally, you will have one or two event loops per core. To help with distributing the load across event loops, you can use an EventLoopGroup. On top of EventLoops sit Channels and ChannelPipelines, which provide a friendlier way to be notified on an incoming event associated to a given file descriptor and to dispatch work to process it.

ChannelHandlers provide the steps that a pipeline executes sequentially to handle an event. All handlers are executed on the same thread to make their implementation simpler by not requiring synchronization. This also means handlers cannot block. The highest-level abstraction that SwiftNIO provides is Bootstrap, which streamlines the creation of channels for specific use cases, such as a ServerBootstrap, a ClientBootstrap, and a DatagramBootstrap. You can find all the details in the official documentation.

You can include SwiftNIO into your own project by adding the following dependency to your Package.swift:

dependencies: [
    .package(url: "", from: "1.0.0")

Additionally, you can find two sample apps, NIOChat and NIOEcho, in SwiftNIO repo that demonstrate how you can use the framework.

Rate this Article

Adoption Stage

Hello stranger!

You need to Register an InfoQ account or or login to post comments. But there's so much more behind being registered.

Get the most out of the InfoQ experience.

Tell us what you think

Allowed html: a,b,br,blockquote,i,li,pre,u,ul,p

Email me replies to any of my messages in this thread
Community comments

Allowed html: a,b,br,blockquote,i,li,pre,u,ul,p

Email me replies to any of my messages in this thread

Allowed html: a,b,br,blockquote,i,li,pre,u,ul,p

Email me replies to any of my messages in this thread


Login to InfoQ to interact with what matters most to you.

Recover your password...


Follow your favorite topics and editors

Quick overview of most important highlights in the industry and on the site.


More signal, less noise

Build your own feed by choosing topics you want to read about and editors you want to hear from.


Stay up-to-date

Set up your notifications and don't miss out on content that matters to you