If your backend returns images that are not optimised for display, it’s good practice to downsample them. MapleBacon comes with support for downsampling via displayOptions:
MapleBacon allows you to apply transformations to images and have the results cached so that you app doesn’t need to perform the same work over and over. To make your own transformer, create a class conforming to the ImageTransforming protocol. A transform can be anything you like, let’s create one that applies a Core Image sepia filter:
private class SepiaImageTransformer: ImageTransforming {
// The identifier is used as part of the cache key. Make sure it's something unique
let identifier = "com.schnaub.SepiaImageTransformer"
func transform(image: UIImage) -> UIImage? {
let filter = CIFilter(name: "CISepiaTone")!
let ciImage = CIImage(image: image)
filter.setValue(ciImage, forKey: kCIInputImageKey)
filter.setValue(0.5, forKey: kCIInputIntensityKey)
let context = CIContext()
guard let outputImage = filter.outputImage,
let cgImage = context.createCGImage(outputImage, from: outputImage.extent) else {
return image
}
// Return the transformed image which will be cached (or used by another transformer)
return UIImage(cgImage: cgImage)
}
}
You then pass this filter to MapleBacon in one of the convenience methods:
let url = URL(string: "…")
let transformer = SepiaImageTransformer()
imageView.setImage(with: url, transformer: transformer)
If you want to apply multiple transforms to an image, you can chain your transformers:
let chainedTransformer = SepiaImageTransformer()
.appending(transformer: DifferentTransformer())
.appending(transformer: AnotherTransformer())
Or if you prefer, using the custom >>> operator:
let chainedTransformer = SepiaImageTransformer() >>> DifferentTransformer() >>> AnotherTransformer()
(Keep in mind that if you are using Core Image it might not be optimal to chain individual transformers but rather create one transformer that applies multiple CIFilters in one pass. See the Core Image Programming Guide.)
Caching
MapleBacon will cache your images both in memory and on disk. Disk storage is automatically pruned after a week (taking into account the last access date as well) but you can control the maximum cache time yourself too:
On iOS13 and above, you can use Combine to fetch images from MapleBacon
MapleBacon.shared.image(with: url)
.receive(on: DispatchQueue.main) // Dispatch to the right queue if updating the UI
.sink(receiveValue: { image in
// Do something with your image
})
.store(in: &subscriptions) // Hold on to and dispose your subscriptions
Migrating from 5.x
There is a small migration guide in the wiki when moving from the 5.x branch to 6.x
License
MapleBacon is available under the MIT license. See the LICENSE file for more info.
MapleBacon
Introduction
MapleBacon is a lightweight and fast Swift library for downloading and caching images.
Example
The folder
Example
contains a sample projects for you to try.Requirements
Installation
MapleBacon is available through CocoaPods. To install add it to your Podfile:
Carthage
and Swift Package Manager.
Usage
UIImageView
The most basic usage is via an extension on
UIImageView
. You pass it URL:If you want to add a placeholder while the image is downloading you specify that like this:
If your backend returns images that are not optimised for display, it’s good practice to downsample them. MapleBacon comes with support for downsampling via
displayOptions
:Image Transformers
MapleBacon allows you to apply transformations to images and have the results cached so that you app doesn’t need to perform the same work over and over. To make your own transformer, create a class conforming to the
ImageTransforming
protocol. A transform can be anything you like, let’s create one that applies a Core Image sepia filter:You then pass this filter to MapleBacon in one of the convenience methods:
If you want to apply multiple transforms to an image, you can chain your transformers:
Or if you prefer, using the custom
>>>
operator:(Keep in mind that if you are using Core Image it might not be optimal to chain individual transformers but rather create one transformer that applies multiple
CIFilter
s in one pass. See the Core Image Programming Guide.)Caching
MapleBacon will cache your images both in memory and on disk. Disk storage is automatically pruned after a week (taking into account the last access date as well) but you can control the maximum cache time yourself too:
Combine
On iOS13 and above, you can use
Combine
to fetch images from MapleBaconMigrating from 5.x
There is a small migration guide in the wiki when moving from the 5.x branch to 6.x
License
MapleBacon is available under the MIT license. See the LICENSE file for more info.