Bite-sized videos on iOS development.
The iOS landscape is large and changes often. With short, bite-sized videos released on a steady schedule, NSScreencast helps keep you continually up to date.
Up to date with Xcode 15 and iOS 17
UIKit, SwiftUI, SwiftData, and macOS
Swift Language
High Quality Videos
Short and Focused
Any Device
Team Plans
Have I mentioned lately how awesome NSScreencast is? No? Worth the subscription. Check it out if you’re an iOS developer. Or even if you’re not and you want an example of how to do coding screencasts well.
Got tired of dead-end googling so I checked to see if @NSScreencast had covered what I was looking for. Of course he had, 4 years ago. Should have checked there first.
One 13-minute episode of @NSScreencast just paid for the yearly subscription fee in amount of time saved. Do it.
Seriously great stuff even for seasoned developers. I’ve learned a good amount from Ben’s videos.
You can really expand your development horizons in just a few minutes a week with NSScreencast.
Random PSA for iOS developers: @NSScreencast is a great resource, and worth every penny. It’s high quality, practical, and honest.
Can’t say enough good things about @NSScreencast There is gold in the Road Trip DJ Series.
I just reuppped my subscription to @NSScreencast. [An] indespensible resource if you’re into iOS or Mac Development.
Just finished @NSScreencast series on Modern CollectionViews. Strongly recommended. Programmatic UI, nicely structured code, easily approachable explanation style. 👌
#587
In this episode, we explore parsing strings into structured data using the Swift parsing library from Point Free. We demonstrate how to create composable parsers, starting with a simple example, then build a couple more complex parsers, including one for parsing sample input from Advent of Code and another for parsing CSV data of taxi trips. We'll explore how to use both forms of parsers and lean on composability to build them up.
#576
Now that we have our database setup, we can create our models. We'll start by examining the Model and Content protocols, then implement the necessary properties decorated with Fluent's property wrappers to denote primary keys, fields, and foreign keys.
#575
In order to evolve a persistent store over time you have to migrate the data. Fluent, the Vapor Framework that offers ORM support for popular databases, has a solution for this. In this episode we will understand how to write migrations, how to revert them and how to evolve your schema over time without losing data.
#569
This episode discusses how to work with the ModelContext in a SwiftUI app to insert and delete data. The ModelContext can be accessed through the ModelContainer, which is set up in the environment automatically. The @Query macro is used to retrieve artists from the database and iterate over them. We also implement swipe to delete using the onDelete modifier.
#566
With many great features announced each year, it's easy for smaller changes to go without as much fanfare. In this episode we'll take a look at a new way to format dates using the .formatted() API. It's easy to use, expressive, and best of all we don't need to worry about caching formatters anymore!
#565
In this episode we take a look at the newly announced Swift Testing framework that is currently in preview. This leverages Swift Macros to make tests much more friendly to write, gives you much richer diagnostic information when tests fail, and is generally a welcome improvement over using XCTest. Keep in mind this is a preview at the time of recording and will require a snapshot toolchain of Swift.
#556
Now that we have a view for rendering link previews, now we integrate it into the timeline. We'll start by updating our model to capture links, then move on to adjusting the layout within the post view.
#555
Posts with links in them can be expanded to show richer information, including an image for many sites that support it. In this episode we'll utilize the LinkPresentation framework to add this to our app. We'll also build out a cache using NSCache to ensure that we respond quickly when rendering the same post while scrolling.
#532
Property Wrappers are great for encapsulating cross-cutting concerns and simplifying common patterns. However, previously it seemed impossible to access the enclosing instance to enable more advanced and useful behaviors. As it turns out, this was supported all along, just in a not-so-obvious way. Let me show you.
#527
iOS 14 brought some nice improvements to os_log via a new type called Logger. This leverages Swift's StringInterpolation type to make it much more usable for formatting values inside your logs. It does this without sacrificing the privacy and performance that makes os_log so appealing. In this episode we will see how we can adopt this new API as well as how StringInterpolation works under the hood.
#526
One of the most impactful things you can do to improve productivity is to improve turnaround time when iterating on features. Playgrounds and Xcode Live Previews are great, but both have their limitations. In this episode we will explore how to utilize hot module reloading to have the simulator automatically reflect your changes when you save. It's magic, and will blow your mind!
#517
In this episode we will look at two ways of generating async values with AsyncStream. We'll examine the difference between the push and pull models and how to deal with back pressure.
#516
We explore how we might encapsulate logic within an AsyncSequence and introduce the need for a type erased version. Type-erasure has some pros and cons and in this video we will explore how to create one called AnyAsyncSequence and how we can use it.
#515
In this episode we will see how to create and use our own AsyncSequence, which allow us to iterate over values that can arrive asynchronously. We'll see how this compares to traditional sequences and how to make use of AsyncIterator to build our own AsyncSequence implementations.
#514
The unit of work in Swift Concurrency is the Task. In this episode we will see how tasks are created and structured, how to run work in parallel, and how to handle cancellation by aborting work or returning partial results.
#513
Actors are a new first class concept in swift. In this episode we will explore the problem they solve and how to use them to avoid race conditions which can lead to inconsistent results or even crashes.
#512
Continuations are great for adapting completion-handler APIs to the new async await world. But what about delegate callbacks, which happen in an entirely separate method? In this episode we will adapt 2 delegate APIs into async await to see how this works.
#511
With Continuations we can bridge the non-async world and make it async. Continuations allow us to take the result of a completion block and turn it into an async flow. In this episode we will see the difference between checked and unchecked continuations as well as their throwing variants.
#509
In this episode we will see how we can run tasks concurrently with concurrent for loops, which is useful when the number of items you want to process is dynamic. With Task Groups you can process results asynchronously and assemble the results in a safe way.
#508
In this episode we will show how the async await keyword can simplify asynchronous code, reading top-down as if it were synchronous, but without blocking any threads. We'll also see how async let can allow you to process multiple values concurrently.
#506
Now that we've seen how to setup a feature module, we'll also need to decide how best to share a feature's resources and deal with dependencies.
#493
Let's quickly review how to work with the Locale object. Then we can use various locales in conjunction with NumberFormatter and ListFormatter to have localized output provided for us.
#490
In this episode we introduce a new open source library called Swift Coding that takes all of these concepts and wraps it up into a Swift Package you can use in your own projects. We give a tour of what the library can do and how you can use it.
#488
Last time we talked about the Encodable protocol. This time let's look at the Decodable protocol. We explore the general concept, then introduce zip and map as utilities to compose smaller decodings into larger ones.