Nuke 12 enhances the two main APIs introduced in the previous release: LazyImage
and the async ImagePipeline
methods. They are faster, more robust, and easier to use.
The migration guide is available to help with the update. The minimum requirements are unchanged from Nuke 11.
Concurrency
Redesign the concurrency APIs making them more ergonomic and fully Sendable
compliant.
- Add
ImagePipeline/imageTask(with:)
method that returns a new typeAsyncImageTask
let task = ImagePipeline.shared.imageTask(with: URL(string: "example.com"))
task.priority = .high
for await progress in task.progress {
print("Updated progress: ", progress)
}
let image = try await task.image
- The existing convenience
ImagePipeline/image(for:)
method now returns an image instead ofImageResponse
- Remove the
delegate
parameter fromImagePipeline/image(for:)
method to address the upcoming concurrency warnings in Xcode 14.3 - Remove
ImageTaskDelegate
and move its methods toImagePipelineDelegate
and add thepipeline
parameter
NukeUI 2.0
NukeUI started as a separate repo, but the initial production version was released as part of Nuke 11. Let's call it NukeUI 1.0. The framework was designed before the AsyncImage
announcement and had a few discrepancies that made it harder to migrate from AsyncImage
. This release addresses the shortcomings of the original design and features a couple of performance improvements.
LazyImage
now usesSwiftUI.Image
instead ofNukeUI.Image
backed byUIImageView
andNSImageView
. It eliminates any discrepancies betweenLazyImage
andAsyncImage
layout and self-sizing behavior and fixes issues with.redacted(reason:)
,ImageRenderer
, and other SwiftUI APIs that don't work with UIKIt and AppKit based views.- Remove
NukeUI.Image
so the name no longer clashes withSwiftUI.Image
- Fix #669:
redacted
not working forLazyImage
- GIF rendering is no longer included in the framework. Please consider using one of the frameworks that specialize in playing GIFs, such as Gifu. It's easy to integrate, especially with
LazyImage
. - Extract progress updates from
FetchImage
to a separate observable object, reducing the number of body reloads LazyImage
now requires a single body calculation to render the response from the memory cache (instead of three before)- Disable animations by default
- Fix an issue where the image won't reload if you change only
LazyImage
processors
orpriority
without also changing the image source FetchImage/image
now returnsImage
instead ofUIImage
- Make
_PlatformImageView
internal (was public) and remove more typealiases
Nuke
- Add a new initializer to
ImageRequest.ThumbnailOptions
that accepts the target size, unit, and content mode - #677 - ImageCache uses 20% of available RAM which is quite aggressive. It's an OK default on iOS because it clears 90% of the used RAM when entering the background to be a good citizen. But it's not a good default on a Mac. Starting with Nuke 12, the default size is now strictly limited to 512 MB.
ImageDecoder
now defaults to scale1
for images (configurable usingUserInfoKey/scaleKey
)- Removes APIs deprecated in the previous versions
- Update the Performance Guide
NukeVideo
Video playback can be significantly more efficient than playing animated GIFs. This is why the initial version of NukeUI provided support for basic video playback. But it is not something that the majority of the users need, so this feature was extracted to a separate module called NukeVideo
.
There is now less code that you need to include in your project, which means faster compile time and smaller code size. With this and some other changes in Nuke 12, the two main frameworks – Nuke and NukeUI – now have 25% less code compared to Nuke 11. In addition to this change, there are a couple of improvements in how the precompiled binary frameworks are generated, significantly reducing their size.
- Move all video-related code to
NukeVideo
- Remove
ImageContainer.asset
. The asset is now added toImageContainer/userInfo
under the new.videoAssetKey
. - Reduce the size of binary frameworks by up to 50%