Support extending memory cache TTL to a specified time instead of the fixed original expire setting. Use the .memoryCacheAccessExtendingExpiration to set a customize expiration extending duration when accessing the image. #1196
Add prebuilt binary framework when releasing to GitHub. Further supporting of fully compatible binary framework would come after Swift module stability. #1194
Fix
Resizing performance for animated images should be improved dramatically. #1189
A small optimization on MD5 calculation for image file cache key. #1183
Add support for loading progressive JPEG images. This feature is still in beta and will be improved in the next few releases. To try it out, make sure you are loading a progressive JPEG image with a .progressiveJPEG options passed in. Thanks @lixiang1994#1181
Choose to use Swift.Result as the default result type when Swift 5.0 or above is applied. #1146
Fix
Apply to some modern Swift syntax, which may also improve internal performance a bit. #1181
Now ImagePretcher also supports using Source as fetching target. #1142
An option to skip file name hashing when storing image to disk cashe. #1140
Supports multiple Swift versions for CocoaPods 1.7.0.
Fix
An issue that loading a downsampled image from original version might lead to different scale and potential memory performance problem. #1126
Marking setter of kf wrapper as nonmutating and seperate value/reference version of KingfisherCompatible. This allows mutating properties on kf even with a let declaration. #1134
A regression which causes stack overflow when using ImagePretcher to load huge ammount of images. #1143
Add Result type to Kingfisher. Now all callbacks in Kingfisher are using Result instead of tuples. This is more future-friendly and provides a modern way to make error handling better.
Make KingfisherError much more elaborate and accurate. Instead of simply provides the error code, now KingfisherError contains error reason and necessary associated values. It will help to understand and track the errors easier.
Better cache management by separating memory cache and disk cache to their own storages. Now you can use MemoryStorage and DiskStorage as the ImageCache backend.
Image cache of memory storage would be purged automatically in a certain time interval. This reduce memory pressure for other parts of your app.
The ImageCache is rewritten from scratch, to get benefit from new created MemoryStorage and DiskStorage. At the same time, this hybrid cache abstract keeps most API compatibility from the earlier versions.
Now the ImageCache can receive only raw Data object and cache it as needed.
A KingfisherParsedOptionsInfo type to parse KingfisherOptionsInfoItems in related API. This improves reusability and performance when handling options in Kingfisher.
An option to specify whether an image should also prefetched to memory cache or not.
An option to make the disk file loading synchronously instead of in its own I/O queue.
Options to specify cache expiration for either memory cache or disk cache. This gives you a chance to control cache lifetime in a per-task grain size.
Add a default maximum size for memory cache. Now only at most 25% of your device memory will be used to kept images in memory. You can also change this value if needed.
An option to specify a processing queue for image processors. This gives your flexibility if you want to use main queue or if you want to dispatch the processing to a different queue.
A DownsamplingImageProcessor for downsampling an image to a given size before loading it to memory.
Add ImageDataProvider protocol to make it possible to provide image data locally instead of downloading from network. Several concrete types are provided to load images from data format. Use LocalFileImageDataProvider to load an image from a local disk path, Base64ImageDataProvider to load image from a Base64 string representation and RawImageDataProvider to provide a raw Data object.
A general Source protocol to define from where the image should be loaded. Currently, we support to load an image from ImageDataProvider or from network now.
Fix
Now CommonCrypto from system is used to calculate file name from cache key, instead of using a customized hash algorithm.
An issue which causes ImageDownloader crashing when a lot of downloading tasks running at the same time.
All operations like image pretching and data receiving should now be performed in non-UI threads correctly.
Now KingfisherCompatible uses struct for kf namespacing for better performance.
Add ImageModifier to give a final chance for setting image object related properties just before getting back the image from either network or cache. #810
Fix
Apply scale on all image based processor methods, including the existing ones from memory cache. #813
An option for only getting cached images from memory or refresh it by downloading. It could be useful for fetching images behind the same URL while keeping to use the latest memory cached ones. #806
Fix
A problem when setting customized indicator with non-zero frame. Now the indicator will be no longer resized to image view size incorrectly. #798
Improve store performance by avoiding re-encode images as long as the original data could be provided. #805
Supports for Swift 4. The new major version of Kingfisher should be source compatible with Kingfisher 3. Please make sure you have no warning left with Kingfisher related APIs before migrating to version 4, since all deprecated methods are removed from our code base. #704
A cleaner API to track whether an image is cached and its cache type. Use imageChachedType and CacheType.cached instead of isImageCached and CacheCheckResult. #704
Fix
Update pod spec to use Swift 4.0 as Swift Version configuration.
Supports for Swift 4. The new major version of Kingfisher should be source compatible with Kingfisher 3. Please make sure you have no warning left with Kingfisher related APIs before migrating to version 4, since all deprecated methods are removed from our code base. #704
A cleaner API to track whether an image is cached and its cache type. Use imageChachedType and CacheType.cached instead of isImageCached and CacheCheckResult. #704
Introduces a backgroundColor property to RoundCornerImageProcessor allowing to specify a desired backgroud color. It could be useful for a JPEG based image to prevent alpha blending. #766
New cache retriving strategy for a request with certain ImageProcessor applied. Now Kingfisher will first try to get the processed images from cache. If not existing, it will be smart enough to check whether the original image exists in cache to avoid downloading it.
A cacheOriginalImage option to also cache original images while an ImageProcessor is applied. It is required if you want the new cache strategy. #650
A FormatIndicatedCacheSerializer to serialize the image into a certain format (png, jpg or gif). #693
Fix
A timing issue when you try to cancel an on-going download task, and start the same one again immediately. Now the previous one will received an error and the later one could be completed normally. #532
Fix the showing/hiding logic for activity indicator in image view to make them independent from race condition.
A possible race condition that accessing downloading fetch load conccurently.
Invalidate the download session when the downloader gets released. It might cause problem if you were using your own downloader instance.
A default option in KingfisherManager to let users set a global default option to all KingfisherManager related methods, as well as all UI extension methods. #674
Fix
Now the options appended will overwrite the previous one. This makes users be able to set proper options in a per-image-way, even when there is already a default option set in KingfisherManager.
Deprecate requestsUsePipeling in ImageDownloader since there was a typo. Now use requestsUsePipelining instead. #673
An API to apply rect round for specified corner in RoundCornerImageProcessor. Instead of making all four corners rounded, you can now set only some corners rounding. #668
A problem in CroppingImageProcessor and crop method of images which crops wrong area for images with a non-1 scale. #649
Refactor for ResizingImageProcessor. targetSize of ResizingImageProcessor is now deprecated. Use referenceSize instead. It's just a name changing for clearer API. #646
Use the onlyLoadFirstFrame option to load only the first frame from a GIF file. It will be useful when you want to display a static preview of the first frame from a GIF image. By doing so, you could save huge ammount of memory. #591
Fix
Now cancel on a RetrieveImageTask will work properly even when the downloading not started for UIButton and NSButton too. #580
Progress block of extensions setting methods will not be called multiple times if you set another task while the previous one still in downloading. #583
Image cache will work properly when ImagePrefetcher trying to prefetch images with an ImageProcessor. Now the fetched and processed images could be retrieved correctly. #590
Improve preload animated image loading strategy by using background queue. This should improve framerate when loading a lot of GIF files in the same time. #529
Make ImageDownloader a pure Swift class to avoid the SDK bug which might leak memory in iOS 10. #520
A new set of KingfisherOptionsInfo extension helpers to extract options easiser. It will be useful when you are trying to implement your own processors or serializers. #505
Mark the empty task for downloader as public. #508
Fix
Set placeholder image even when the input resource is nil. This is a regression from version 3.2.0. #510
A new option to ignore placeholder and keep current image while loading/downloading a new one. This would be useful when you want to display the earlier image while loading a new one. 494
A disk cache path closure to let you fully customize the disk cache path. #499
Fix
Move methods which were marked as open to their class defination scope, to avoid the compiler restriction when overridden. #500
An issue which prevents using multiple image processors at the same time. Now you can use different ImageProcessor at the same time for an image, while keeping high performance since only one downloading process would be fired. #460
A crash when processing some images with built-in ResizingImageProcessor and OverlayImageProcessor while the input images not having a standard format. #440, #461
ImageCache could accept a path extension as key now. #456
Swift 3 compatibility. This version follows Swift 3 API design guideline as well as contains a lot of breaking changes from version 2.x. See Kingfisher 3.0 Migration Guide for more about how to migrate your project to 3.0. Kingfisher 2.6.x is still supporting both Swift 2.2 and 2.3.
Image Processor. Now you can specify an image processor and it will be used to process images after downloaded. It is useful when you need to apply some transforming or filter to the image. You can also use the processor to support any other image format, like WebP. See Processor section in the wiki for more. The default processor should behave the same as before. #420
Built-in processors from simple round corner and resizing to filters like tint and blur. Check Built-in processors of Kingfisher for more.
Cache Serializer. CacheSerializer will be used to convert some data to an image object for retrieving from disk cache and vice versa for storing to disk cache.
New indicator type. Now you should be able to use your own indicators. #430
ImageDownloadRequestModifier. Use this protocol to modify requests being sent to your server.
Fix
Resource is now a protocol instead of a struct. Use ImageResource for your original Resource type. And now URL conforms Resource so the APIs could be clearer.
Now Kingfisher cache will store re-encoded image data instead of the original data by default. This is needed due to we want to store the processed data from ImageProcessor. If this is not what you want, you should supply your customized instanse of CacheSerializer.
Remove
KingfisherManager.init is removed since you should never create your own manager.
cachedImageExistsforURL in ImageCache is removed since it introduced unnecessary coupling. Use isImageCached instead.
Swift 3 compatibility. This version follows Swift 3 API design guideline as well as contains a lot of breaking changes from version 2.x. See Kingfisher 3.0 Migration Guide for more about how to migrate your project to 3.0. Kingfisher 2.6.x is still supporting both Swift 2.2 and 2.3.
Image Processor. Now you can specify an image processor and it will be used to process images after downloaded. It is useful when you need to apply some transforming or filter to the image. You can also use the processor to support any other image format, like WebP. See Processor section in the wiki for more. The default processor should behave the same as before. #420
Built-in processors from simple round corner and resizing to filters like tint and blur. Check Built-in processors of Kingfisher for more.
Cache Serializer. CacheSerializer will be used to convert some data to an image object for retrieving from disk cache and vice versa for storing to disk cache.
New indicator type. Now you should be able to use your own indicators. #430
ImageDownloadRequestModifier. Use this protocol to modify requests being sent to your server.
Fix
Resource is now a protocol instead of a struct. Use ImageResource for your original Resource type. And now URL conforms Resource so the APIs could be clearer.
Now Kingfisher cache will store re-encoded image data instead of the original data by default. This is needed due to we want to store the processed data from ImageProcessor. If this is not what you want, you should supply your customized instanse of CacheSerializer.
Accept nil as valid URL parameter for image view's extension methods.
Fix
The completion handler of image view setting method will not be called any more if self is released.
Improve empty task so some performance improvment could be achieved.
Remove SwiftLint since it keeps adding new rules but without a back compatible support. It makes the users confusing when using a different version of SwiftLint.
Removed Implicit Unwrapping of CacheType that caused crashes if the image is not cached.
A standalone AnimatedImageView to reduce memory usage when parsing and displaying GIF images. See README for more about using Kingfisher for GIF images. #300
Fix
An issue which may cause iOS app crasing when switching background/foreground multiple times. #309
Change license of String+MD5.swift to a more precise one. #302
Add ImagePrefetcher and related prefetching methods to allow downloading and caching images before you need to display them. #249
A protocol (AuthenticationChallengeResponable) for responsing authentication challenge. You can now set authenticationChallengeResponder of ImageDownloader and use your own authentication policy. #226
An API (cachePathForKey(:)) to get real path for a specified key in a cache. #256
Fix
Disable background decoding for images from memory cache. This improves the performance of image loading for in-memory cached images and fix a flicker when you try to load image with background decoding. #257
A potential crash in ImageCache when an empty image is passed into.
Make pipeling support to be disabled by default since it requiring server support. You can enable it by setting requestsUsePipeling in ImageDownloader. #253
Image transition now allows user interaction. #252
Cache path is customizable now. You can use Document folder to cache user generated images (But be caution that the disk cache files might be removed if limitation condition met).
Multiple cache/downloader system. You can know specify the cache/downloader you need to use for each image request. It will be useful if you need different cache or download policy for different images.
Changed Options to OptionsInfo for flexible options passing.
Fix
An issue which preventing image downloading when modifying the url of request.
Deprecate
All extension methods with KingfisherOptions are deprecated now. Use KingfisherOptionsInfo instead.