PhotoKit — qué es, conceptos clave y PHAsset

Autor: IT Sectr Publicado: 2026-05-06 Tiempo de lectura: 8 min

PhotoKit es un framework de Apple para trabajar con la librería multimedia en iOS y macOS, que proporciona acceso directo a fotos, videos y Live Photos en el dispositivo. Según la documentación de Apple, el framework reemplaza al obsoleto AssetsLibrary y admite iCloud, álbumes, edición y Change Tracking. PhotoKit proporciona una API unificada para consultas, almacenamiento en caché y cambios en la librería multimedia con sincronización automática a través de iCloud.

Puntos clave

  • PhotoKit es un framework de Apple para trabajar con la librería multimedia del sistema, que proporciona acceso a fotos, videos, Live Photos y álbumes.
  • PHAsset es un modelo de datos que representa un único elemento multimedia (foto o video) con metadatos: fecha, ubicación, tipo.
  • PHFetchResult es un contenedor de resultados de consulta con carga diferida y notificaciones de cambios a través de PHPhotoLibraryChangeObserver.
  • PHImageManager es un gestor para obtener imágenes con opciones de tamaño, modo y almacenamiento en caché a través de PHCachingImageManager.
  • PHPhotoLibrary es el punto de entrada para realizar cambios: crear, eliminar y editar objetos multimedia.

¿Qué es PhotoKit?

PhotoKit es un framework de Apple (presentado en iOS 8, macOS 10.11) que proporciona una API orientada a objetos para trabajar con la librería multimedia del sistema. A diferencia de AssetsLibrary, PhotoKit trata la librería multimedia como una base de datos: las consultas devuelven objetos PHAsset, PHCollection y PHCollectionList que representan el contenido y la estructura de almacenamiento.

PhotoKit admite todos los tipos de medios: fotos (JPEG, HEIF, RAW), videos (MOV, MP4), Live Photos y ráfagas de fotos. El framework gestiona automáticamente la sincronización de iCloud: si una imagen está almacenada en iCloud, PhotoKit la solicita a través de la red e informa del progreso mediante PHImageRequestOptions.progressHandler.

Una característica clave de PhotoKit es el modelo de datos basado en PHObject con un identificador local (localIdentifier) que permanece estable entre sesiones. Esto permite guardar referencias a objetos multimedia y restaurarlos después de reiniciar la aplicación sin necesidad de volver a consultarlos.

Cómo funciona PhotoKit: modelo de datos y consultas

PhotoKit se basa en tres niveles: modelo de datos (PHObject), consultas (PHFetchResult) y cambios (PHPhotoLibrary.performChanges). El modelo de datos es jerárquico: PHAsset (foto/video) se encuentra dentro de PHAssetCollection (álbum), y los álbumes se agrupan en PHCollectionList (carpeta).

Realizar consultas

Las consultas se ejecutan a través de PHAsset.fetchAssets y PHAssetCollection.fetchAssetCollections. Todos los métodos fetch son síncronos y devuelven PHFetchResult, que ejecuta inmediatamente la consulta contra la base de datos de la librería multimedia. PHFetchResult admite acceso rápido por índice (object(at:)) y enumeración mediante enumerateObjects.

  • fetchAssets(with:options:) — consultar todos los medios filtrados por tipo, fecha, álbum
  • fetchAssetCollections(with:subtype:options:) — consultar álbumes y carpetas
  • fetchAssets(in:options:) — consultar medios dentro de un álbum específico

PHFetchOptions

PHFetchOptions es un objeto para configurar consultas: ordenación (sortDescriptors), predicado (predicate), inclusión de medios ocultos y eliminados (includeHiddenAssets, includeAllBurstAssets). Las opciones de fetch permiten filtrar por tipo de medio: PHAssetMediaType.image, .video, .audio.

Clases principales de PhotoKit

PhotoKit incluye un conjunto de clases para acceder, consultar y modificar la librería multimedia. Comprender cada una de ellas es esencial para trabajar eficazmente con el framework.

PHAsset

PHAsset es un objeto inmutable que representa un único elemento multimedia. Contiene metadatos: mediaType, mediaSubtypes, creationDate, location, pixelWidth, pixelHeight, duration (para video), isFavorite, burstIdentifier. LocalIdentifier es una clave de cadena estable accesible incluso después de reiniciar la aplicación.

PHAssetCollection

PHAssetCollection es un grupo de medios: álbumes del sistema (Recents, Favorites, Selfies, Screenshots), álbumes de usuario o Moments (agrupados automáticamente por tiempo y lugar). Atributos: localizedTitle, assetCollectionType, assetCollectionSubtype, startDate, endDate.

PHCollectionList

PHCollectionList es una carpeta que contiene álbumes (PHAssetCollection) u otras carpetas. Se usa con poca frecuencia, principalmente para mostrar la jerarquía en la interfaz de usuario.

PHImageManager y almacenamiento en caché

PhotoKit no devuelve UIImage directamente desde PHAsset — es necesario solicitar una imagen a través de PHImageManager. Esto garantiza que la imagen se cargue con soporte de iCloud, almacenamiento en caché y el tamaño requerido.

ComponentePropósitoCaracterística
PHImageManager.default()Gestor estándar para solicitudes únicasSin caché entre solicitudes
PHCachingImageManagerGestor con precarga para coleccionesstartCachingImages para desplazamiento suave
PHImageRequestOptionsConfiguración de solicitud: tamaño, modo, entregasynchronous, deliveryMode, progressHandler
PHImageRequestIDIdentificador de solicitud para cancelacióncancelImageRequest(PHImageRequestID)

PHImageManager admite tres modos de entrega: opportunistic (primero una versión reducida, luego la completa), highQualityFormat (solo calidad completa) y fastFormat (versión más rápida disponible). Para colecciones, use siempre PHCachingImageManager con precarga de imágenes para las celdas visibles.

Ejemplos de uso de PhotoKit en Swift

PhotoKit se utiliza para crear galerías personalizadas, editores y aplicaciones multimedia. Veamos tres escenarios clave.

Obtener todas las fotos de la librería multimedia

PHAsset.fetchAssets con PHFetchOptions ordenado por fecha de creación es la consulta básica para construir una galería de fotos personalizada. PHFetchResult admite carga diferida y acceso en streaming.

swift
let options = PHFetchOptions()
options.sortDescriptors = [NSSortDescriptor(
    key: "creationDate",
    ascending: .false
)]
options.predicate = NSPredicate(
    format: "mediaType == %d",
    PHAssetMediaType.image.rawValue
)

let allPhotos = PHAsset.fetchAssets(with: options)
print("Found \(allPhotos.count) photos")

allPhotos.enumerateObjects { asset, index, stop in
    print("Photo \(index): \(asset.localIdentifier)")
}

PHFetchResult es un contenedor thread-safe. Acceder a objetos por índice mediante object(at:) no bloquea la UI, pero solicitar una imagen a través de PHImageManager debe hacerse de forma asíncrona.

Cargar imágenes con almacenamiento en caché

PHCachingImageManager es una subclase de PHImageManager con métodos startCachingImages y stopCachingImages para precarga. Se usa en UICollectionView para un desplazamiento suave.

swift
let cachingManager = PHCachingImageManager()
let targetSize = CGSize(width: 200, height: 200)

// Precarga para celdas visibles
cachingManager.startCachingImages(
    for: visibleAssets,
    targetSize: targetSize,
    contentMode: .aspectFill,
    options: nil
)

// Solicitar imagen a través de PHImageRequestOptions con fallback de iCloud
let requestOptions = PHImageRequestOptions()
requestOptions.deliveryMode = .opportunistic
requestOptions.isNetworkAccessAllowed = .true
requestOptions.progressHandler = { progress, error, stop, info in
    DispatchQueue.main.async {
        print("Downloading from iCloud: \(progress * 100)%")
    }
}

let requestID = cachingManager.requestImage(
    for: asset,
    targetSize: targetSize,
    contentMode: .aspectFill,
    options: requestOptions
) { image, info in
    print("Got image: \(image?.size ?? .zero)")
}

Editar la librería multimedia: añadir favoritos

Los cambios en la librería multimedia se realizan a través de PHPhotoLibrary.shared().performChanges dentro de un bloque changeRequest. Todas las operaciones se agrupan y se aplican de forma transaccional.

swift
PHPhotoLibrary.shared().performChanges {
    let changeRequest = PHAssetChangeRequest(for: asset)
    changeRequest.isFavorite = .true
} completionHandler: { success, error in
    if success {
        print("Added to favorites")
    }
}

Cambios y observación mediante Change Tracking

PhotoKit proporciona un mecanismo para observar los cambios en la librería multimedia a través del protocolo PHPhotoLibraryChangeObserver. Cuando se producen cambios (creación, eliminación, edición), se llama al método photoLibraryDidChange con un objeto PHChange.

PHChange contiene changeDetails para cada tipo de consulta: PHFetchResultChangeDetails con removedIndexes, insertedIndexes, changedIndexes. Esto permite aplicar cambios a la UI con animación: performBatchUpdates con move, insert, delete para UICollectionView.

swift
class PhotosViewController: UIViewController {
    var fetchResult: PHFetchResult>PHAsset>?

    override func viewDidLoad() {
        super.viewDidLoad()
        PHPhotoLibrary.shared().register(self)
    }

    deinit {
        PHPhotoLibrary.shared().unregisterChangeObserver(self)
    }
}

extension PhotosViewController: PHPhotoLibraryChangeObserver {
    func photoLibraryDidChange(_ changeInstance: PHChange) {
        guard let fetchResult,
              let details = changeInstance.changeDetails(for: fetchResult)
        else { return }

        DispatchQueue.main.async {
            self.fetchResult = details.fetchResultAfterChanges
            // Aplicar cambios a collectionView
        }
    }
}

Edición de RAW y extensiones

PhotoKit admite la edición de medios a través del mecanismo PHContentEditingInput y PHContentEditingOutput. La aplicación solicita editingInput con los datos originales, aplica cambios y guarda el resultado mediante editingOutput. El framework conserva automáticamente el original, permitiendo a los usuarios revertir los cambios restableciendo el original.

Las fotos RAW (DNG, CR2, NEF) se admiten a través de PHAssetResourceManager, que proporciona acceso al archivo RAW original. Para el procesamiento RAW, se recomienda usar CoreImage con el filtro CIRAWFilter, que permite ajustar temperatura, exposición y nitidez. PhotoKit también admite extensiones de editor a través de Photo Editing Extension (iOS): una aplicación puede ser invocada desde el editor del sistema para procesar una foto o video seleccionado.

Optimización del rendimiento de PhotoKit

PhotoKit es un framework potente pero que consume muchos recursos. Un uso incorrecto puede provocar ralentizaciones al desplazarse y un consumo excesivo de memoria. Siga estas recomendaciones para un rendimiento óptimo.

  • Use PHCachingImageManager para colecciones — la precarga de imágenes para las celdas visibles +/-1 pantalla elimina los retrasos al desplazarse
  • Establezca targetSize — nunca solicite PHImageManagerMaximumSize para miniaturas. Use un tamaño igual al tamaño físico de la celda multiplicado por la escala de la pantalla
  • Cancele las solicitudes al reutilizar celdas — guarde PHImageRequestID y llame a cancelImageRequest en prepareForReuse
  • Limite las solicitudes de iCloud — durante el desplazamiento rápido, establezca isNetworkAccessAllowed = false y cargue fotos de iCloud solo al detenerse
  • Almacene en caché PHFetchResult — fetchAssets repetidos con las mismas opciones devuelven un nuevo PHFetchResult. Guarde el resultado como una propiedad y actualícelo mediante Change Observer

PHLivePhoto requiere una solicitud separada a través de PHLivePhoto.request(with:targetSize:contentMode:options:resultHandler:). No solicite Live Photo para celdas que solo muestran fotos — use PHLivePhotoBadge como indicador.

Preguntas frecuentes

¿Qué es PhotoKit y en qué se diferencia de AssetsLibrary?

PhotoKit es un framework moderno de Apple para trabajar con la librería multimedia, presentado en iOS 8. A diferencia del obsoleto AssetsLibrary, PhotoKit proporciona el modelo de objetos PHAsset, PHFetchResult con búsqueda rápida, soporte de iCloud y Change Tracking para observar cambios.

¿Cómo solicitar acceso a la librería multimedia a través de PhotoKit?

Llame a PHPhotoLibrary.requestAuthorization(for: .readWrite) con un manejador de devolución de llamada. Después de recibir el estado .authorized, puede ejecutar consultas PHAsset.fetchAssets. El acceso de escritura requiere permiso .readWrite. Para solo lectura — .addOnly.

¿Cómo obtener una imagen de PHAsset?

Use PHImageManager.default().requestImage con parámetros: asset, targetSize, contentMode y PHImageRequestOptions. El método asíncrono devuelve PHImageRequestID, que permite cancelar la solicitud. Para colecciones, use PHCachingImageManager con precarga.

¿Cómo rastrear cambios en la librería multimedia?

Registre un observador mediante PHPhotoLibrary.shared().register(self) e implemente el protocolo PHPhotoLibraryChangeObserver. En el método photoLibraryDidChange, reciba PHChange con changeDetails para cada fetchResult y aplique cambios a la UI con animación.

¿Cómo manejar fotos de iCloud en PhotoKit?

En PHImageRequestOptions, establezca isNetworkAccessAllowed = true y un progressHandler para rastrear el progreso de descarga de iCloud. Durante el desplazamiento rápido, desactive el acceso a la red y cargue solo versiones locales para evitar retrasos.

Resumen

  • PhotoKit es un framework de Apple para trabajar con la librería multimedia, que reemplaza a AssetsLibrary desde iOS 8 y macOS 10.11.
  • PHAsset es el modelo de datos principal con un identificador local, tipo, fecha, ubicación y tamaño.
  • PHFetchResult realiza consultas sincrónicas al almacenamiento y proporciona acceso thread-safe a los resultados.
  • PHCachingImageManager con precarga garantiza un desplazamiento suave en colecciones sin retrasos.
  • Change Tracking mediante PHPhotoLibraryChangeObserver permite que la UI reaccione instantáneamente a los cambios en la librería multimedia.
  • Sincronización de iCloud está integrada en el framework: solicitar una imagen la descarga automáticamente de iCloud con progreso.
  • Optimización — el targetSize adecuado, la cancelación de solicitudes y la limitación de iCloud durante el desplazamiento son críticos para el rendimiento.

Desarrollaremos una aplicación móvil llave en mano

IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.

Discutir el proyecto

Lea también