Advanced pure Swift framework for loading, caching, processing, displaying and preheating images. It uses latest advancements in iOS SDK and doesn't reinvent existing technologies.
Nuke is a pipeline that loads images using multiple dependencies which can be injected in runtime.
Nuke.taskWithURL(URL) {
let image = $0.image
}.resume()
- Zero config
- Performant, asynchronous, thread safe
- Optional Alamofire integration
- Optional FLAnimatedImage integration
- Uses NSURLSession with HTTP/2 support
- Uses a single data task for multiple equivalent requests
- Automated preheating of images close to the viewport
- Doesn't reinvent caching, relies on HTTP cache and its implementation in Foundation
- Caching is completely transparent to the client
- Two cache layers including top level memory cache for decompressed images
- Apply image filters
- Background image decompression and scaling in a single step
- Scale large images (~6000x4000 px) and prepare them for display with ease
- Resize loaded images to fit displayed size
- Image decoder composition
- Image filter composition
- Customize different parts of the framework using dependency injection
- Download the latest release version
- Experiment with Nuke APIs in a Swift playground
- Take a look at the demo project, it's easy to install with
pod try Nuke
command - Install,
import Nuke
and enjoy!
Nuke.taskWithURL(imageURL) {
let image = $0.image
}.resume()
var request = ImageRequest(URLRequest: <#NSURLRequest#>)
request.targetSize = CGSize(width: 300.0, height: 400.0) // Set target size in pixels
request.contentMode = .AspectFill
Nuke.taskWithRequest(request) {
let image = $0.image // Image is resized
}.resume()
Nuke.taskWithRequest(request) { response in
switch response {
case let .Success(image, info):
// Use image and inspect info
case let .Failure(error):
// Handle error
}
}.resume()
let task = Nuke.taskWithURL(imageURL).resume()
task.progress = { completed, total in
// Update progress
}
let state = task.state // Track task state
task.completion { // Add multiple completions, even for completed task
let image = $0.image
}
task.cancel()
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCellWithReuseIdentifier(cellReuseID, forIndexPath: indexPath)
let imageView: ImageView = <#view#>
imageView.prepareForReuse()
imageView.setImageWithURL(imageURL)
return cell
}
Cancel image task as soon as the cell goes offscreen (optional):
func collectionView(collectionView: UICollectionView, didEndDisplayingCell cell: UICollectionViewCell, forItemAtIndexPath indexPath: NSIndexPath) {
let imageView: ImageView = <#view#>
imageView.prepareForReuse()
}
let filter1: ImageProcessing = <#filter#>
let filter2: ImageProcessing = <#filter#>
let filterComposition = ImageProcessorComposition(processors: [filter1, filter2])
var request = ImageRequest(URL: <#image_url#>)
request.processor = filterComposition
Nuke.taskWithRequest(request) {
// Filters are applied, filtered image is stored in memory cache
let image = $0.image
}.resume()
let processor1: ImageProcessing = <#processor#>
let processor2: ImageProcessing = <#processor#>
let composition = ImageProcessorComposition(processors: [processor1, processor2])
let decoder1: ImageDecoding = <#decoder#>
let decoder2: ImageDecoding = <#decoder#>
let composition = ImageDecoderComposition(decoders: [decoder1, decoder2])
let requests = [ImageRequest(URL: imageURL1), ImageRequest(URL: imageURL2)]
Nuke.startPreheatingImages(requests: requests)
Nuke.stopPreheatingImages(requests: requests)
let preheater = ImagePreheatingControllerForCollectionView(collectionView: <#collectionView#>)
preheater.delegate = self // Signals when preheat window changes
let dataLoader: ImageDataLoading = <#dataLoader#>
let decoder: ImageDecoding = <#decoder#>
let cache: ImageMemoryCaching = <#cache#>
let configuration = ImageManagerConfiguration(dataLoader: dataLoader, decoder: decoder, cache: cache)
ImageManager.shared = ImageManager(configuration: configuration)
Protocol | Description |
---|---|
ImageManaging |
A high-level API for loading images |
ImageDataLoading |
Performs loading of image data (NSData ) |
ImageDecoding |
Converts NSData to UIImage objects |
ImageProcessing |
Processes decoded images |
ImageMemoryCaching |
Stores processed images into memory cache |
To install Nuke add a dependency in your Podfile:
# use_frameworks!
# platform :ios / :watchos / :osx
pod "Nuke"
pod "Nuke-Alamofire-Plugin" # optional
pud "Nuke-AnimatedImage-Plugin" # optional
To install Nuke add a dependency to your Cartfile:
github "kean/Nuke"
github "kean/Nuke-Alamofire-Plugin" # optional
Import installed modules in your source files
import Nuke
import NukeAlamofirePlugin
import NukeAnimatedImagePlugin
- iOS 8.0+ / watchOS 2.0+ / OS X 10.9+
- Xcode 7.0+, Swift 2.0+
- If you need help, use Stack Overflow. (Tag 'iosnuke')
- If you found a bug, and can provide steps to reproduce it, open an issue.
- If you have a feature request, open an issue.
- If you want to contribute, branch of the
develop
branch and submit a pull request.
Nuke is available under the MIT license. See the LICENSE file for more info.