Nuke 11 embraces Swift Structured Concurrency with full feature parity with completion-based APIs. With NukeUI now being part of the main repo, adding async image loading into your apps is easier than ever. There are no major source-breaking changes, but tens of API refinements to make the framework more ergonomic.
For feedback, please use Nuke 11 Discussion Channel
Structured Concurrency
Extend Async/Await APIs to have complete feature parity with the existing completion-based APIs paving the road for its eventual deprecation and removal in the future major versions.
- Make
@MainActor
the following types:FetchImage
,LazyImage
,LazyImageView
, NukeloadImage(into:)
method - Make most types
Sendable
, includingImagePipeline
,ImageRequest
,ImageResponse
,ImageContainer
,ImageTask
, and many more - Add
ImageTaskDelegate
to achieve complete feature-parity with completion-based APIs - #559
Loading an image and monitoring download progress:
func loadImage() async throws {
let response = try await pipeline.image(for: "https://example.com/image.jpeg", delegate: self)
}
func imageTaskWillStart(_ task: ImageTask) {
// You can capture a task instance here to change priority later, etc
}
func imageTask(_ task: ImageTask, didUpdateProgress progress: (completed: Int64, total: Int64)) {
print("Image task did update progress: \(progress)")
}
- Add
images(for:)
method that returns an AsyncThrowingStream to represent progressive decoding - #558
Progressively loading an image using an async sequence:
for try await response in pipeline.images(for: "https://example.com/image.jpeg") {
print("Decoded a new image: \(response)")
}
ImageRequest
now accepts async/await function to fetch data as a resource
NukeUI and Nuke Extensions
- Move NukeUI to the main Nuke repo
- Remove deprecated APIs from NukeUI
- NukeUI no longer exposes public Gifu dependency or its APIs
- Move
UIImageView
/NSImageView
extensions to a separate targetNukeExtensions
and soft-deprecated them - #555
Error Reporting Improvements
- Make an "advanced" version of
ImageProcessing
APIs throwing - Make
ImageDecoding
throwing - Add support for throwing processing in
ImageProcessors.CoreImageFilter
- Add
ImageDecoding
instance,ImageDecodingContext
, and underlying error to.decodingFailed
error case - Add
ImageProcessingContext
and underlying error to.processingFailed
error case - Add
.dataMissingInCache
error case for a scenario where data is missing in cache and download is disabled using.returnCacheDataDontLoad
. - Add
.dataIsEmpty
error case for a scenario where the data loader doesn't report an error, but the response is empty. - Add
.decoderNotRegistered(context:)
error case for a scenario where no decoders are registered for the downloaded data. This should never happen unless you remove the default decoder from the registry. - Add
.imageRequestMissing
error case for a scenario when the load image method is called with no image request. - Add
cacheType
toImageDecodingContext
Other Changes
- Increase the minimum supported Xcode version to 13.3
- Increase minimum supported platforms: iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15
- Use
preparingForDisplay
on iOS 15 and tvOS 15 - Add
ImageRequest
toImageResponse
- Automatically discover typos on CI - #549
- Add an option to skip load data immediately by skipping the data loading queue - #552
- Implement custom disk caching for requests backed by data publishers - #553
- Deprecate
ImageDecoderRegistering
- Make
ImageDecoderRegistry
initializer private - Make
ImageDecodingContext
,ImageProcessingContext
,ImageResponse
properties publicly writable - Rename
isFinal
inImageProcessingContext
toisCompleted
to match the renaming APIs DataLoader
now collects metricsURLSessionTaskMetrics
and reports them using an existingDataLoaderObserving
protocol- Add static
default
andimageIO
functions toImageEncoding
protocol for easy creating of encoders - Make
ImageCache
ttl
optional instead of using0
as a "never expires" indicator - Add
sizeLimit
towithDataCache
ImagePipeline.Configuration
initializer - Remove
WKInterfaceObject
support (in favor of SwiftUI) - Remove
ImageType
typealias (deprecated in 10.5) - Remove
Cancellable
conformance fromURLSessionTask