Releases: kean/Nuke
Nuke 11.0
Nuke 11 embraces Swift Structured Concurrency with full feature parity with legacy completion-based APIs. NukeUI is now part of the main repo. Docs were completely rewritten using DocC and hosted on GitHub: Nuke, NukeUI, NukeExtensions.
There are no major source-breaking changes in this release. Instead, it adds dozens of API refinements to make the framework more ergonomic.
- 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
- Add support for Xcode 14.0
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.
- Add
@MainActor
to the following types:FetchImage
,LazyImage
,LazyImageView
, NukeloadImage(into:)
method - Add
Sendable
to most of the Nuke types, includingImagePipeline
,ImageRequest
,ImageResponse
,ImageContainer
,ImageTask
, and more - Add
ImageTaskDelegate
to achieve complete feature-parity with completion-based APIs - #559 ImageRequest
now accepts async/await function to fetch data as a resource
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 imageTaskCreated(_ task: ImageTask) {
// You can capture the task instance here to change priority later, etc
}
func imageTask(_ task: ImageTask, didUpdateProgress progress: ImageTask.Progress) {
// Update progress
}
func imageTask(_ task: ImageTask, didReceivePreview response: ImageResponse) {
// Display progressively decoded image
}
// And more...
NukeUI and NukeExtensions
NukeUI is now part of the main repo and the existing UIKit and AppKit UI extensions were moved from the main module to NukeExtensions and soft-deprecated.
- Move NukeUI to the main Nuke repo
- Move
UIImageView
/NSImageView
extensions to a separate targetNukeExtensions
and soft-deprecated them - #555 - Remove deprecated APIs from NukeUI
- Add
ImageResponse
typealias to NukeUI - Use new
ImageTask.Progress
in NukeUI - NukeUI no longer exposes public Gifu dependency or its APIs
Error Reporting Improvements
A complete overhaul of ImagePipeline.Error
with many new cases covering every single point of failure in the pipeline.
- Add
throws
to "advanced"ImageProcessing
- Add
throws
toImageDecoding
- 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
- Fix #511
OSAtomic
deprecation warnings - #573 - Add
ImageTask.State
. Improve performance when canceling and changing priority of completed tasks. - Add
ImageTask.Progress
to simplify progress reporting APIs - Add
ImageRequest.Options.skipDecompression
- Add public
ImageCacheKey
initializer withImageRequest
- Add
imageCache(for:pipeline:)
method toImagePipelineDelegate
- Add automatic
hashableIdentifier
implementation toImageProcessing
types that implementHashable
protocol - #563 - Add a way to customize decompression using
ImagePipelineDelegate
- Add
ImageRequest
toImageResponse
- Improve decompression performance by using
preparingForDisplay
on iOS 15 and tvOS 15 - Add metrics reporting using
DataLoaderObserving
protocol - Add custom disk caching for requests backed by data publishers - #553
- Add
.pipelineInvalidated
error that is thrown for new requests started on the invalidated pipeline - Add public write access to
ImageDecodingContext
,ImageProcessingContext
,ImageResponse
properties - Add static
default
andimageIO
functions toImageEncoding
protocol for easy creating of encoders - Add
sizeLimit
towithDataCache
ImagePipeline.Configuration
initializer - Make
ImageCache
ttl
optional instead of using0
as a "never expires" indicator
Removals and Deprecations
- Soft-deprecate
ImageRequestConvertible
and useImageRequest
andURL
directly in all news APIs for better discoverability and performance - #567 - Deprecate
ImageDecoderRegistering
- Deprecate
ImageCaching
extension that works withImageRequest
- Rename
isFinal
inImageProcessingContext
toisCompleted
to match the remaining APIs - Rename
ImagePipeline/Configuration/DataCachePolicy
toImagePipeline/DataCachePolicy
- Remove
ImageRequestConvertible
conformance fromString
- Remove
ImageTaskEvent
and consolidate it with the newImageTaskDelegate
API - #564 - Remove progress monitoring using
Foundation.Progress
- Remove
WKInterfaceObject
support (in favor of SwiftUI) - Remove
ImageType
typealias (deprecated in 10.5) - Remove
Cancellable
conformance fromURLSessionTask
- Remove public
ImagePublisher
class (make it internal)
Non-Code Changes
- Automatically discover typos on CI - #549
- Remove
CocoaPods
support
Nuke 11.0 (RC1)
Nuke 11 embraces Swift Structured Concurrency with full feature parity with legacy completion-based APIs. NukeUI is now part of the main repo. Docs were completely rewritten using DocC and hosted on GitHub: Nuke, NukeUI, NukeExtensions.
There are no major source-breaking changes in this release. Instead, it adds dozens of API refinements to make the framework more ergonomic.
- 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
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.
- Add
@MainActor
to the following types:FetchImage
,LazyImage
,LazyImageView
, NukeloadImage(into:)
method - Add
Sendable
to most of the Nuke types, includingImagePipeline
,ImageRequest
,ImageResponse
,ImageContainer
,ImageTask
, and more - Add
ImageTaskDelegate
to achieve complete feature-parity with completion-based APIs - #559 ImageRequest
now accepts async/await function to fetch data as a resource
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 imageTaskCreated(_ task: ImageTask) {
// You can capture the task instance here to change priority later, etc
}
func imageTask(_ task: ImageTask, didUpdateProgress progress: ImageTask.Progress) {
// Update progres
}
func imageTask(_ task: ImageTask, didReceivePreview response: ImageResponse) {
// Display progressively decoded image
}
// And more...
NukeUI and NukeExtensions
NukeUI is now part of the main repo and the existing UIKit and AppKit UI extensions were moved from the main module to NukeExtensions and soft-deprecated.
- Move NukeUI to the main Nuke repo
- Move
UIImageView
/NSImageView
extensions to a separate targetNukeExtensions
and soft-deprecated them - #555 - Remove deprecated APIs from NukeUI
- Add
ImageResponse
typealias to NukeUI - Use new
ImageTask.Progress
in NukeUI - NukeUI no longer exposes public Gifu dependency or its APIs
Error Reporting Improvements
A complete overhaul of ImagePipeline.Error
with many new cases covering every single point of failure in the pipeline.
- Add
throws
to "advanced"ImageProcessing
- Add
throws
toImageDecoding
- 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
- Fix #511
OSAtomic
deprecation warnings - #573 - Add
ImageTask.State
. Improve performance when canceling and changing priority of completed tasks. - Add
ImageTask.Progress
to simplify progress reporting APIs - Add
ImageRequest.Options.skipDecompression
- Add public
ImageCacheKey
initializer withImageRequest
- Add
imageCache(for:pipeline:)
method toImagePipelineDelegate
- Add automatic
hashableIdentifier
implementation toImageProcessing
types that implementHashable
protocol - #563 - Add a way to customize decompression using
ImagePipelineDelegate
- Add
ImageRequest
toImageResponse
- Improve decompression performance by using
preparingForDisplay
on iOS 15 and tvOS 15 - Add metrics reporting using
DataLoaderObserving
protocol - Add custom disk caching for requests backed by data publishers - #553
- Add
.pipelineInvalidated
error that is thrown for new requests started on the invalidated pipeline - Add public write access to
ImageDecodingContext
,ImageProcessingContext
,ImageResponse
properties - Add static
default
andimageIO
functions toImageEncoding
protocol for easy creating of encoders - Add
sizeLimit
towithDataCache
ImagePipeline.Configuration
initializer - Make
ImageCache
ttl
optional instead of using0
as a "never expires" indicator
Removals and Deprecations
- Soft-deprecate
ImageRequestConvertible
and useImageRequest
andURL
directly in all news APIs for better discoverability and performance - #567 - Deprecate
ImageDecoderRegistering
- Deprecate
ImageCaching
extension that works withImageRequest
- Rename
isFinal
inImageProcessingContext
toisCompleted
to match the renaming APIs - Rename
ImagePipeline/Configuration/DataCachePolicy
toImagePipeline/DataCachePolicy
- Remove
ImageRequestConvertible
conformance fromString
- Remove
ImageTaskEvent
and consolidate it with the newImageTaskDelegate
API - #564 - Remove progress monitoring using
Foundation.Progress
- Remove
WKInterfaceObject
support (in favor of SwiftUI) - Remove
ImageType
typealias (deprecated in 10.5) - Remove
Cancellable
conformance fromURLSessionTask
- Remove public
ImagePublisher
class (make it internal)
Non-Code Changes
- Automatically discover typos on CI - #549
- Remove
CocoaPods
support
Nuke 11.0 (Beta 5)
Nuke 11.0 (Beta 4)
- Soft-deprecate
ImageRequestConvertible
and useImageRequest
andURL
directly in all news APIs for better discoverability and performance - #567 - Rename
ImagePipeline/Configuration/DataCachePolicy
toImagePipeline/DataCachePolicy
- More documentation improvements: Nuke, NukeUI, NukeExtensions
Nuke 11.0 (Beta 3)
- Docs completely rewritten using DocC and hosted on GitHub: Nuke, NukeUI, NukeExtensions
- Deprecate
ImageCaching
extension that works withImageRequest
- Make
ImageCacheKey
initializer withImageRequest
public - Add static method
ImageProcessing.custom(id:closure:)
for creating custom processors - Make
ImagePipeline.Cache
Sendable
- Add
ImageResponse
typealias to NukeUI - Use new
ImageTask.Progress
in NukeUI - When pipeline is invalidated, it now throws a new
.pipelineInvalidated
error for new requests
Nuke 11.0 (Beta 2)
In addition to changes made in Nuke 11.0 (Beta 1):
- Add DocC support. For the latest documentation, use the docs from the project repo.
- Add
imageCache(for:pipeline:)
method toImagePipelineDelegate
- Remove public
ImagePublisher
class (make it internal) ImageProcessing
types that implementHashable
protocol now get defaulthashableIdentifier
implementation - #563- Add a way to customize decompression using
ImagePipelineDelegate
- Remove
CocoaPods
support - Remove
ImageTaskEvent
and consolidate it with the newImageTaskDelegate
API - #564 - Add
ImageTask.Progress
to simplify progress reporting APIs - Add
ImageRequest.Options.skipDecompression
- Remove progress monitoring using
Foundation.Progress
- Remove
ImageRequestConvertible
conformance fromString
For feedback, please use Nuke 11 Discussion Channel
Nuke 11.0 (Beta 1)
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
Nuke 10.11.2
- Revert changes to the deployment targets introduced in 10.10 release
The minimum deployment targets will be increased in the upcoming major release
Nuke 10.11.1
- Fix an issue with data not always being attached to an error when decoding fails
Nuke 10.11.0
- Add associated
Data
toImagePipeline.Error.decodingFailed
- #545, thanks to Shai Mishali
There are other major improvements to error reporting coming in Nuke 11