Sobre el proyecto
Kingfisher es una potente biblioteca pura en Swift para descargar y almacenar en caché imágenes de la web. Proporciona una forma pura en Swift de trabajar con imágenes remotas en tu próxima aplicación.
## Características
- Descarga y almacenamiento en caché de imágenes de forma asíncrona.
- Carga de imágenes desde redes basadas en URLSession o desde datos locales proporcionados.
- Procesadores y filtros de imágenes útiles incluidos.
- Caché híbrida de múltiples capas tanto en memoria como en disco.
- Control preciso del comportamiento de la caché con fecha de caducidad y límite de tamaño personalizables.
- Sondeo de caché asíncrono opcional en KingfisherManager para evitar bloquear el hilo de llamada en comprobaciones de caché en disco.
- Descarga cancelable y reutilización automática del contenido descargado previamente para mejorar el rendimiento.
- Componentes independientes: usa el descargador, el sistema de caché y los procesadores de imágenes por separado según sea necesario.
- Precarga de imágenes y visualización desde la caché para impulsar tu aplicación.
- Extensiones para UIImageView, NSImageView, NSButton, UIButton, NSTextAttachment, WKInterfaceImage, TVMonogramView y CPListItem para establecer directamente una imagen desde una URL.
- Animación de transición integrada al establecer imágenes.
- Marcador de posición e indicador personalizables mientras se cargan las imágenes.
- Procesamiento de imágenes y formato de imagen fácilmente extensibles.
- Compatibilidad con el modo de bajo consumo de datos.
- Compatibilidad con SwiftUI.
- Preparado para Swift 6 y Swift Concurrency (modo estricto).
- Carga y caché para Live Photo.
## Kingfisher 101
El caso de uso más simple es establecer una imagen en una vista de imagen con la extensión UIImageView:
```swift
import Kingfisher
let url = URL(string: "https://example.com/image.png")
imageView.kf.setImage(with: url)
```
Kingfisher descargará la imagen desde la url, la enviará tanto a la caché en memoria como a la caché en disco, y la mostrará en imageView. Cuando la establezcas con la misma URL más tarde, la imagen se recuperará de la caché y se mostrará inmediatamente.
También funciona si usas SwiftUI:
```swift
var body: some View {
KFImage(URL(string: "https://example.com/image.png")!)
}
```
## Un ejemplo más avanzado
Con las potentes opciones, puedes realizar tareas difíciles con Kingfisher de forma sencilla. Por ejemplo, el código siguiente:
1. Descarga una imagen de alta resolución.
2. La reduce para que coincida con el tamaño de la vista de imagen.
3. La redondea con un radio dado.
4. Muestra un indicador del sistema y una imagen de marcador de posición durante la descarga.
5. Cuando está lista, anima la pequeña miniatura con un efecto de "fundido de entrada".
6. La imagen grande original también se almacena en caché en disco para su uso posterior, evitando descargarla de nuevo en una vista de detalle.
7. Se imprime un registro en consola cuando finaliza la tarea, ya sea por éxito o fallo.
```swift
let url = URL(string: "https://example.com/high_resolution_image.png")
let processor = DownsamplingImageProcessor(size: imageView.bounds.size)
|> RoundCornerImageProcessor(cornerRadius: 20)
imageView.kf.indicatorType = .activity
imageView.kf.setImage(
with: url,
placeholder: UIImage(named: "placeholderImage"),
options: [
.processor(processor),
.scaleFactor(UIScreen.main.scale),
.transition(.fade(1)),
.cacheOriginalImage
])
{
result in
switch result {
case .success(let value):
print("Task done for: \(value.source.url?.absoluteString ?? "")")
case .failure(let error):
print("Job failed: \(error.localizedDescription)")
}
}
```
Es una situación común que puedo encontrar en mi trabajo diario. ¡Piensa cuántas líneas necesitarías escribir sin Kingfisher!
## Encadenamiento de métodos
Si no eres fan de la extensión kf, también puedes preferir usar el constructor KF y encadenar las invocaciones de métodos. El código siguiente hace lo mismo:
```swift
// Use `kf` extension
imageView.kf.setImage(
with: url,
placeholder: placeholderImage,
options: [
.processor(processor),
.loadDiskFileSynchronously,
.cacheOriginalImage,
.transition(.fade(0.25)),
.lowDataMode(.network(lowResolutionURL))
],
progressBlock: { receivedSize, totalSize in
// Progress updated
},
completionHandler: { result in
// Done
}
)
// Use `KF` builder
KF.url(url)
.placeholder(placeholderImage)
.setProcessor(processor)
.loadDiskFileSynchronously()
.cacheMemoryOnly()
.fade(duration: 0.25)
.lowDataModeSource(.network(lowResolutionURL))
.onProgress { receivedSize, totalSize in }
.onSuccess { result in }
.onFailure { error in }
.set(to: imageView)
```
Y mejor aún, si más tarde quieres cambiar a SwiftUI, solo cambia el KF anterior por KFImage, y ya está:
```swift
struct ContentView: View {
var body: some View {
KFImage.url(url)
.placeholder(placeholderImage)
.setProcessor(processor)
.loadDiskFileSynchronously()
.cacheMemoryOnly()
.fade(duration: 0.25)
.lowDataModeSource(.network(lowResolutionURL))
.onProgress { receivedSize, totalSize in }
.onSuccess { result in }
.onFailure { error in }
}
}
```
## Requisitos
### Rama de desarrollo actual
- iOS 15.0+ / macOS 12.0+ / tvOS 15.0+ / watchOS 9.0+ / visionOS 1.0+
- Compilador Xcode 26.0+ / Swift 6.2+
### Kingfisher 8.0
- (UIKit/AppKit) iOS 13.0+ / macOS 10.15+ / tvOS 13.0+ / watchOS 6.0+ / visionOS 1.0+
- (SwiftUI) iOS 14.0+ / macOS 11.0+ / tvOS 14.0+ / watchOS 7.0+ / visionOS 1.0+
- Swift 5.9+
### Kingfisher 7.0
- (UIKit/AppKit) iOS 12.0+ / macOS 10.14+ / tvOS 12.0+ / watchOS 5.0+ / visionOS 1.0+
- (SwiftUI) iOS 14.0+ / macOS 11.0+ / tvOS 14.0+ / watchOS 7.0+ / visionOS 1.0+
- Swift 5.0+
## Instalación
Consulta uno de los siguientes tutoriales para instalar y usar el framework:
- [Tutorial de UIKit](https://swiftpackageindex.com/onevcat/kingfisher/master/tutorials/kingfisher/gettingstarteduikit)
- [Tutorial de SwiftUI](https://swiftpackageindex.com/onevcat/kingfisher/master/tutorials/kingfisher/gettingstartedswiftui)
Alternativamente, puedes seguir cualquiera de los métodos a continuación.
### Swift Package Manager
- File > Swift Packages > Add Package Dependency
- Añade `https://github.com/onevcat/Kingfisher.git`
- Selecciona "Up to Next Major" con "8.0.0"
### CocoaPods
```ruby
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '13.0'
use_frameworks!
target 'MyApp' do
pod 'Kingfisher', '~> 8.0'
end
```
### Framework precompilado
1. Abre la página de releases, descarga la última versión de Kingfisher desde la sección de assets.
2. Arrastra `Kingfisher.xcframework` a tu proyecto y añádelo al target (normalmente el target de la app).
3. Selecciona tu target, en la pestaña "General", busca la sección "Frameworks, Libraries, and Embedded Content", establece `Embed Without Signing` para Kingfisher.
## Documentación
Consulta la documentación y los tutoriales:
- [Inicio de la documentación](https://swiftpackageindex.com/onevcat/kingfisher/master/documentation/kingfisher)
- [Primeros pasos](https://swiftpackageindex.com/onevcat/kingfisher/master/documentation/kingfisher/gettingstarted)
- [Tutorial de UIKit](https://swiftpackageindex.com/onevcat/kingfisher/master/tutorials/kingfisher/gettingstarteduikit)
- [Tutorial de SwiftUI](https://swiftpackageindex.com/onevcat/kingfisher/master/tutorials/kingfisher/gettingstartedswiftui)
- [Tareas comunes - General](https://swiftpackageindex.com/onevcat/kingfisher/master/documentation/kingfisher/commontasks)
- [Tareas comunes - Caché](https://swiftpackageindex.com/onevcat/kingfisher/master/documentation/kingfisher/commontasks_cache)
- [Tareas comunes - Descargador](https://swiftpackageindex.com/onevcat/kingfisher/master/documentation/kingfisher/commontasks_downloader)
- [Tareas comunes - Procesador](https://swiftpackageindex.com/onevcat/kingfisher/master/documentation/kingfisher/commontasks_processor)
### Migración
- [Migración a Kingfisher 8.0](https://swiftpackageindex.com/onevcat/kingfisher/master/documentation/kingfisher/migration-to-8)
- [Migración a Kingfisher 7.0](https://github.com/onevcat/Kingfisher/wiki/Kingfisher-7.0-Migration-Guide)
Si estás usando una versión aún más antigua, consulta las guías a continuación para conocer los pasos de migración.
## Otros
### Futuro de Kingfisher
Quiero mantener Kingfisher ligero. Este framework se centra en proporcionar una solución simple para descargar y almacenar en caché imágenes. Esto no significa que el framework no pueda mejorarse. Kingfisher está lejos de ser perfecto, por lo que se harán actualizaciones necesarias y útiles para mejorarlo.
### Desarrollo y pruebas
Cualquier contribución y pull request es bienvenida. Sin embargo, antes de que planees implementar algunas características o intentar corregir un problema incierto, se recomienda abrir primero una discusión. Se agradecería que tus pull requests pudieran compilar con todas las pruebas en verde. :)
### Sobre el logo
El logo de Kingfisher está inspirado en el Tangram (七巧板), un rompecabezas de disección que consiste en siete formas planas de China. Creo que ella es un martín pescador en lugar de un vencejo, pero alguien insiste en que es una paloma. Supongo que debería darle un nombre. Hola, chicos, ¿tenéis alguna sugerencia?
### Contacto
Sígueme y contáctame en Twitter o Sina Weibo. Si encuentras un problema, abre un ticket. Las pull requests también son muy bienvenidas.
## Colaboradores y patrocinadores
Los proyectos de código abierto no pueden vivir mucho tiempo sin tu ayuda. Si encuentras Kingfisher útil, considera apoyar este proyecto convirtiéndote en patrocinador. Tu icono de usuario o el logo de tu empresa aparecerá en mi blog con un enlace a tu página de inicio.
Conviértete en patrocinador a través de GitHub Sponsors. :heart:
Agradecimientos especiales a imgly y emergetools.
### Licencia
Kingfisher se publica bajo la licencia MIT. Consulta LICENSE para más detalles.
Comments
0 Rating appears after 10 ratings
Sign in to join the discussion.