Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

360
Vistas
Problema de memoria de la lista SwiftUI, las imágenes no se desasignan de la RAM y causan un bloqueo

Estoy cargando imágenes en una lista de SwiftUI. Cuando se desplazan demasiadas imágenes hacia abajo, la memoria RAM se dispara y la aplicación se bloquea. ¿Por qué las imágenes no se desasignan cuando el usuario se desplaza hacia abajo?

Estoy cargando imágenes así:

 List(allProducts, id: \.self) { product in Image(uiImage: UIImage(data: dataFromRealmDB[product])) }

Mi intuición me dice que debe haber algo para desasignarlo manualmente de la memoria, así que estoy intentando lo siguiente. Por favor, hágame saber si usted cómo llenar el espacio en blanco.

 List(allProducts, id: \.self) { product in Image(uiImage: UIImage(data: dataFromRealmDB[product])).onDisappear(perform: { "WHAT SHOULD GO HERE TO MAKE THE IMAGE GET PURGED FROM RAM?" } }

Si mi solución sugerida no es posible, hágamelo saber también.

ACTUALIZAR

He cambiado la forma en que se almacenan las imágenes. Ahora se almacenan con FileManager en lugar de guardarlos en RealmDB. Esta es mi función para obtener la imagen. Aún así, el uso de la memoria aumenta y causa un bloqueo, no hay desasignación de SwiftUI.

 func getImage(link: String) -> Image? { let lastPath = URL(string: link)?.lastPathComponent if let dir = try? FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false) { let image : UIImage? = UIImage(contentsOfFile: URL(fileURLWithPath: dir.absoluteString).appendingPathComponent(lastPath!).path) if image != nil { return Image(uiImage: UIImage(contentsOfFile: URL(fileURLWithPath: dir.absoluteString).appendingPathComponent(lastPath!).path)!) } } return Image("noImg") }
over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

¿Está seguro de que no está relacionado con el hecho de que obtiene los datos sin procesar de la imagen de la base de datos? De acuerdo con esta pregunta, una lista de SwiftUI funciona como una vista de tabla, es decir, reutilizando celdas.

Creo que el hecho de que esté utilizando una base de datos para almacenar los datos sin procesar de las imágenes provoca el aumento en la memoria.

Esta es una respuesta basada en una opinión, pero recomendaría agrupar las imágenes por adelantado en la aplicación (si su lógica comercial lo admite), usar nombres en la base de datos e iniciarlos por nombre.

O alojarlos de forma remota y obtenerlos a pedido.

over 4 years ago · Santiago Trujillo Denunciar

0

El código en la pregunta está un poco incompleto, pero la respuesta realmente no es una respuesta de codificación, es más una respuesta de diseño general.

Los objetos de reino se cargan de forma perezosa y, en esencia, nunca invadirán la memoria si se usan correctamente; solo están en la memoria cuando están en uso; por ejemplo, un objeto Realm Results que tiene 10.000 objetos se maneja fácilmente, la memoria se asigna y desasigna automáticamente.

En ese sentido, si almacena objetos de Realm en otros objetos que no son de Realm, como una matriz, eso cambia totalmente el impacto de la memoria y puede abrumar al dispositivo.

Pero, y más importante:

Realm no es una buena manera de almacenar datos de Blob (imágenes de tamaño completo). Una propiedad de Realm tiene una cantidad finita de almacenamiento de 16 Mb y una imagen puede ir mucho más allá.

Hay otras opciones para el almacenamiento de imágenes de MongoDB y Firebase.

Ver mi respuesta a esta pregunta para más detalles

Por último, debe usar la paginación para controlar cuántas imágenes se cargan a la vez desde cualquier fuente que use; eso le permitirá controlar más fácilmente la asignación de memoria y la interfaz de usuario.

Entonces, la última parte es importante, sin importar cuál sea la técnica, cargar un montón de imágenes en la memoria eventualmente abrumará el dispositivo, como puede ver, cambiar a usar FileManger para cargar las imágenes desde el disco en lugar de Realm no va a funcionar. ser una solución a largo plazo; la paginación es el camino a seguir.

Hay algunas bibliotecas de terceros disponibles para ayudar con eso y/o puede crear la suya propia. Haga una búsqueda aquí en SO para 'paginación de imágenes' ya que se discute mucho

Oh - otra cosa; ¡utilice miniaturas para su interfaz de usuario! Realmente solo necesita mostrar imágenes de tamaño completo si el usuario toca o selecciona, luego puede cargarlo desde el disco. Firebase Storage puede hacer eso por ti; cuando carga una imagen de tamaño completo, puede (en su servidor) crear una miniatura para su interfaz de usuario.

Del mismo modo, las miniaturas son pequeñas y Realm puede manejarlas fácilmente; el diseño sería un objeto como este

 class MyImageObject: Object { @Persisted var imageURL: //a string or url to where it's stored on disk @Persisted var thumbnail: Data! @Persisted var image_name = "" //the image name }
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda