All Versions
16
Latest Version
Avg Release Cycle
15 days
Latest Release
68 days ago

Changelog History
Page 1

  • v8.4.0

    November 18, 2019
    • ๐Ÿ›  Fix an issue with RoundedCorners image processor not respecting the Border parameter โ€“ 327, Eric Jensen
    • โž• Add an optional border parameter to the Circle processor โ€“ 327, Eric Jensen
    • โž• Add ImagePipelineObserving and DataLoaderObserving protocols to allow users to tap into the internal events of the subsystems to enable logging and other features โ€“ 322, Abdallah Nehme
    • ๐Ÿ—„ Deprecate Nuke.Image to avoid name clashes with SwiftUI.Image in the future , add PlatformImage instead โ€“ 321
    • ๐Ÿ‘‰ Make ImagePipeline more readable โ€“ 320
    • โšก๏ธ Update demo project to use Swift Package Manager instead of CocoaPods โ€“ 319
  • v8.3.1

    October 26, 2019
    • โž• Add dark mode support to the demo project โ€“ #307, Li Yu
  • v8.3.0

    October 06, 2019
    • โž• Add processors option to ImagePipeline.Configuration โ€“ 300, Alessandro Vendruscolo
    • โž• Add queue option to loadImage and loadData methods of ImagePipeline โ€“ 304
    • โž• Add callbackQueue option to ImagePipeline.Configuration โ€“ 304
  • v8.2.0

    September 21, 2019
  • v8.1.1

    September 01, 2019
    • ๐Ÿ“ฆ Switch to a versioning scheme which is compatible with Swift Package Manager
  • v8.1

    August 25, 2019
    • ๐Ÿ”ง Configure dispatch queues with proper QoS โ€“ #291
    • โœ‚ Remove synchronization points in ImageDecoder which is not needed starting from iOS 10 โ€“ #277
    • โž• Add Swift Package Manager to Installation Guides
    • ๐Ÿ‘Œ Improve Travis CI setup: run tests on multiple Xcode versions, run thread safety tests, run SwiftLint validations, build demo project, validate Swift package โ€“ #279, #280, #281, #284, #285
  • v8.0.1

    July 21, 2019
    • โœ‚ Remove synchronization in ImageDecoder which is no longer needed โ€“ #277
  • v8.0

    July 08, 2019

    ๐Ÿš€ Nuke 8 is the most powerful, performant, and refined release yet. It contains major advancements it some areas and brings some great new features.

    Cache processed images on disk ยท New built-in image processors ยท ImagePipeline v2 ยท Up to 30% faster main thread performance ยท Result type ยท Improved deduplication ยท os_signpost integration ยท Refined ImageRequest API ยท Smart decompression ยท Entirely new documentation

    ๐Ÿ“š Most of the Nuke APIs are source compatible with Nuke 7. There is also a Nuke 8 Migration Guide to help with migration.

    Image Processing

    #227 Cache Processed Images on Disk

    ๐Ÿš€ ImagePipeline now supports caching of processed images on disk. To enable this feature set isDataCacheForProcessedDataEnabled to true in the pipeline configuration and provide a dataCache. You can use a built-in DataCache introduced in Nuke 7.3 or write a custom one.

    Image cache can significantly improve the user experience in the apps that use heavy image processors like Gaussian Blur.

    #243 New Image Processors

    Nuke now ships with a bunch of built-in image processors including:

    • ImageProcessor.Resize
    • ImageProcessor.RoundedCorners
    • ImageProcessor.Circle
    • ImageProcessor.GaussianBlur
    • ImageProcessor.CoreImageFilter

    There are also ImageProcessor.Anonymous to create one-off processors from closures and ImageProcessor.Composition to combine two or more processors.

    #245 Simplified Processing API

    ๐Ÿ‘ Previously Nuke offered multiple different ways to add processors to the request. Now there is only one, which is also better than all of the previous versions:

    let request = ImageRequest( url: URL(string: "http://..."), processors: [ImageProcessor.Resize(size: CGSize(width: 44, height: 44), crop: true), ImageProcessor.RoundedCorners(radius: 16)] )
    

    Processors can also be set using a respective mutable processors property.

    Notice that AnyImageProcessor is gone! You can simply use ImageProcessing protocol directly in places where previously you had to use a type-erased version.

    #229 Smart Decompression

    0๏ธโƒฃ In the previous versions, decompression was part of the processing API and ImageDecompressor was the default processor set for each image request. This was mostly done to simplify implementation but it was confusing for the users.

    In the new version, decompression runs automatically and it no longer a "processor". The new decompression is also smarter. It runs only when needed โ€“ when we know that image is still in a compressed format and wasn't decompressed by one of the image processors.

    ๐Ÿ”ง Decompression runs on a new separate imageDecompressingQueue. To disable decompression you can set a new isDecompressionEnabled pipeline configuration option to false.

    #247 Avoiding Duplicated Work when Applying Processors

    The pipeline avoids doing any duplicated work when loading images. Now it also avoids applying the same processors more than once. For example, let's take these two requests:

    let url = URL(string: "http://example.com/image") pipeline.loadImage(with: ImageRequest(url: url, processors: [ImageProcessor.Resize(size: CGSize(width: 44, height: 44)), ImageProcessor.GaussianBlur(radius: 8)])) pipeline.loadImage(with: ImageRequest(url: url, processors: [ImageProcessor.Resize(size: CGSize(width: 44, height: 44))]))
    

    Nuke will load the image data only once, resize the image once and apply the blur also only once. There is no duplicated work done at any stage. If any of the intermediate results are available in the data cache, they will be used.

    ImagePipeline v2

    Nuke 8 introduced a major new iteration of the ImagePipeline class. The class was introduced in Nuke 7 and it contained a lot of incidental complexity due to addition of progressive decoding and some other new features. In Nuke 8 it was rewritten to fully embrace progressive decoding. The new pipeline is smaller, simpler, easier to maintain, and more reliable.

    It is also faster.

    ๐ŸŽ +30% Main Thread Performance

    The image pipeline spends even less time on the main thread than any of the previous versions. It's up to 30% faster than Nuke 7.

    #239 Load Image Data

    โž• Add a new ImagePipeline method to fetch original image data:

    @discardableResultpublic func loadData(with request: ImageRequest, progress: ((\_ completed: Int64, \_ total: Int64) -\> Void)? = nil, completion: @escaping (Result\<(data: Data, response: URLResponse?), ImagePipeline.Error\>) -\> Void) -\> ImageTask
    

    ๐Ÿš€ This method now powers ImagePreheater with destination .diskCache introduced in Nuke 7.4 (previously it was powered by a hacky internal API).

    #245 Improved ImageRequest API

    The rarely used options were extracted into the new ImageRequestOptions struct and the request initializer can now be used to customize all of the request parameters.

    #255 filteredURL

    You can now provide a filteredURL to be used as a key for caching in case the URL contains transient query parameters:

    let request = ImageRequest( url: URL(string: "http://example.com/image.jpeg?token=123")!, options: ImageRequestOptions( filteredURL: "http://example.com/image.jpeg" ) )
    

    #241 Adopt Result type

    Adopt the Result type introduced in Swift 5. So instead of having a separate response and error parameters, the completion closure now has only one parameter - result.

    public typealias Completion = (\_ result: Result\<ImageResponse, ImagePipeline.Error\>) -\> Void
    

    ๐ŸŽ Performance

    ๐ŸŽ Apart from the general performance improvements Nuke now also offers a great way to measure performance and gain visiblity into how the system behaves when loading images.

    #250 Integrate os_signpost

    โ†” Integrate os_signpost logs for measuring performance. To enable the logs set ImagePipeline.Configuration.isSignpostLoggingEnabled (static property) to true before accessing the shared pipeline.

    ๐ŸŽ With these logs, you have visibility into the image pipeline. For more information see WWDC 2018: Measuring Performance Using Logging which explains os_signpost in a great detail.

    Screenshot 2019-06-01 at 10 46 52

    ๐Ÿ“š Documentation

    ๐Ÿ“š All the documentation for Nuke was rewritten from scratch in Nuke 8. It's now more concise, clear, and it even features some fantastic illustrations:

    Screenshot 2019-06-11 at 22 31 18

    The screenshots come the the reworked demo project. It gained new demos including Image Processing demo and also a way to change ImagePipeline configuration in runtime.

    Misc

    • โž• Add a cleaner way to set ImageTask priority using a new priority property โ€“ #251
    • ๐ŸŽ [macOS] Implement image cost calculation for ImageCache โ€“ #236
    • ๐Ÿ‘ [watchOS] Add WKInterfaceImage support
    • ๐Ÿ›  Future-proof Objective-C ImageDisplaying protocol by adding nuke_ prefixes to avoid clashes in Objective-C runtime
    • โž• Add convenience func decode(data: Data) -> Image? method with a default isFinal argument to ImageDecoding protocol โ€“ e3ca5e
    • โž• Add convenience func process(image: Image) -> Image? method to ImageProcessing protocol
    • DataCache will now automatically re-create its root directory if it was deleted underneath it
    • โž• Add public flush method to DataCache
  • v8.0-rc.1

    June 12, 2019

    ๐Ÿ“š Nuke 8 is the most powerful, performant, and refined release yet. It contains major advancements it some areas and brings some great new features. One of the highlights of this release is the documentation which was rewritten from the ground up.

    Cache processed images on disk ยท New built-in image processors ยท ImagePipeline v2 ยท Up to 30% faster main thread performance ยท Result type ยท Improved deduplication ยท os_signpost integration ยท Refined ImageRequest API ยท Smart decompression ยท Entirely new documentation

    ๐Ÿ“š Most of the Nuke APIs are source compatible with Nuke 7. There is also a Nuke 8 Migration Guide to help with migration.

    Image Processing

    #227 Cache Processed Images on Disk

    ๐Ÿš€ ImagePipeline now supports caching of processed images on disk. To enable this feature set isDataCacheForProcessedDataEnabled to true in the pipeline configuration and provide a dataCache. You can use a built-in DataCache introduced in Nuke 7.3 or write a custom one.

    Image cache can significantly improve the user experience in the apps that use heavy image processors like Gaussian Blur.

    #243 New Image Processors

    Nuke now ships with a bunch of built-in image processors including:

    • ImageProcessor.Resize
    • ImageProcessor.RoundedCorners
    • ImageProcessor.Circle
    • ImageProcessor.GaussianBlur
    • ImageProcessor.CoreImageFilter

    There are also ImageProcessor.Anonymous to create one-off processors from closures and ImageProcessor.Composition to combine two or more processors.

    #245 Simplified Processing API

    ๐Ÿ‘ Previously Nuke offered multiple different ways to add processors to the request. Now there is only one, which is also better than all of the previous versions:

    let request = ImageRequest( url: URL(string: "http://..."), processors: [ImageProcessor.Resize(size: CGSize(width: 44, height: 44), crop: true), ImageProcessor.RoundedCorners(radius: 16)] )
    

    Processors can also be set using a respective mutable processors property.

    Notice that AnyImageProcessor is gone! You can simply use ImageProcessing protocol directly in places where previously you had to use a type-erased version.

    #229 Smart Decompression

    0๏ธโƒฃ In the previous versions, decompression was part of the processing API and ImageDecompressor was the default processor set for each image request. This was mostly done to simplify implementation but it was confusing for the users.

    In the new version, decompression runs automatically and it no longer a "processor". The new decompression is also smarter. It runs only when needed โ€“ when we know that image is still in a compressed format and wasn't decompressed by one of the image processors.

    ๐Ÿ”ง Decompression runs on a new separate imageDecompressingQueue. To disable decompression you can set a new isDecompressionEnabled pipeline configuration option to false.

    #247 Avoiding Duplicated Work when Applying Processors

    The pipeline avoids doing any duplicated work when loading images. Now it also avoids applying the same processors more than once. For example, let's take these two requests:

    let url = URL(string: "http://example.com/image") pipeline.loadImage(with: ImageRequest(url: url, processors: [ImageProcessor.Resize(size: CGSize(width: 44, height: 44)), ImageProcessor.GaussianBlur(radius: 8)])) pipeline.loadImage(with: ImageRequest(url: url, processors: [ImageProcessor.Resize(size: CGSize(width: 44, height: 44))]))
    

    Nuke will load the image data only once, resize the image once and apply the blur also only once. There is no duplicated work done at any stage. If any of the intermediate results are available in the data cache, they will be used.

    ImagePipeline v2

    Nuke 8 introduced a major new iteration of the ImagePipeline class. The class was introduced in Nuke 7 and it contained a lot of incidental complexity due to addition of progressive decoding and some other new features. In Nuke 8 it was rewritten to fully embrace progressive decoding. The new pipeline is smaller, simpler, easier to maintain, and more reliable.

    It is also faster.

    ๐ŸŽ +30% Main Thread Performance

    The image pipeline spends even less time on the main thread than any of the previous versions. It's up to 30% faster than Nuke 7.

    #239 Load Image Data

    โž• Add a new ImagePipeline method to fetch original image data:

    @discardableResultpublic func loadData(with request: ImageRequest, progress: ((\_ completed: Int64, \_ total: Int64) -\> Void)? = nil, completion: @escaping (Result\<(data: Data, response: URLResponse?), ImagePipeline.Error\>) -\> Void) -\> ImageTask
    

    ๐Ÿš€ This method now powers ImagePreheater with destination .diskCache introduced in Nuke 7.4 (previously it was powered by a hacky internal API).

    #245 Improved ImageRequest API

    The rarely used options were extracted into the new ImageRequestOptions struct and the request initializer can now be used to customize all of the request parameters.

    #255 filteredURL

    You can now provide a filteredURL to be used as a key for caching in case the URL contains transient query parameters:

    let request = ImageRequest( url: URL(string: "http://example.com/image.jpeg?token=123")!, options: ImageRequestOptions( filteredURL: "http://example.com/image.jpeg" ) )
    

    #241 Adopt Result type

    Adopt the Result type introduced in Swift 5. So instead of having a separate response and error parameters, the completion closure now has only one parameter - result.

    public typealias Completion = (\_ result: Result\<ImageResponse, ImagePipeline.Error\>) -\> Void
    

    ๐ŸŽ Performance

    ๐ŸŽ Apart from the general performance improvements Nuke now also offers a great way to measure performance and gain visiblity into how the system behaves when loading images.

    #250 Integrate os_signpost

    โ†” Integrate os_signpost logs for measuring performance. To enable the logs set ImagePipeline.Configuration.isSignpostLoggingEnabled (static property) to true before accessing the shared pipeline.

    ๐ŸŽ With these logs, you have visibility into the image pipeline. For more information see WWDC 2018: Measuring Performance Using Logging which explains os_signpost in a great detail.

    Screenshot 2019-06-01 at 10 46 52

    ๐Ÿ“š Documentation

    ๐Ÿ“š All the documentation for Nuke was rewritten from scratch in Nuke 8. It's now more concise, clear, and it even features some fantastic illustrations:

    Screenshot 2019-06-11 at 22 31 18

    The screenshots come the the reworked demo project. It gained new demos including Image Processing demo and also a way to change ImagePipeline configuration in runtime.

    Misc

    • โž• Add a cleaner way to set ImageTask priority using a new priority property โ€“ #251
    • ๐ŸŽ [macOS] Implement image cost calculation for ImageCache โ€“ #236
    • ๐Ÿ‘ [watchOS] Add WKInterfaceImage support
    • ๐Ÿ›  Future-proof Objective-C ImageDisplaying protocol by adding nuke_ prefixes to avoid clashes in Objective-C runtime
    • โž• Add convenience func decode(data: Data) -> Image? method with a default isFinal argument to ImageDecoding protocol โ€“ e3ca5e
    • โž• Add convenience func process(image: Image) -> Image? method to ImageProcessing protocol
    • DataCache will now automatically re-create its root directory if it was deleted underneath it
    • โž• Add public flush method to DataCache
  • v8.0-beta.4

    June 07, 2019

    A small bump to address the feedback from Nuke 8.0-beta.3.

    • ๐Ÿ‘Œ Improve debug descriptions for processors, adopt reverse DNS notation for cache keys
    • โช Revert the changes made in #254 Improve image view extensions. There is going to be no major changes in the primary Nuke.loadImage(:) API in Nuke 8. The extensions are going to be revisited when adding SwiftUI and Combine support.
    • ๐ŸŽ Tune the performance, now we can safely say there is a +25% improvement in some of the common use cases on the main thread.
    • ๐Ÿ“š [Documentation] Update some of the documentation
    • ๐Ÿ”ง [Demo] Add a Settings screen to the demo project to allow change ImagePipeline configuration in runtime