es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo prevenir la reintegración del actor que resulta en solicitudes duplicadas?

En el video de WWDC 2021, “Proteger el estado mutable con actores de Swift”, proporcionan el siguiente fragmento de código:

actor ImageDownloader {
    private var cache: [URL: Image] = [:]

    func image(from url: URL) async throws -> Image? {
        if let cached = cache[url] {
            return cached
        }

        let image = try await downloadImage(from: url)

        cache[url] = cache[url, default: image]

        return cache[url]
    }

    func downloadImage(from url: URL) async throws -> Image { ... }
}

El problema es que los actores ofrecen reentrancia, por lo que la referencia cache[url, default: image] asegura efectivamente que, incluso si se realiza una solicitud duplicada debido a una carrera, al menos se comprueba la memoria caché del actor después de la continuación, lo que garantiza que se obtenga la misma imagen para la solicitud duplicada.

Y en ese video, dicen:

Una solución mejor sería evitar las descargas redundantes por completo. Hemos incluido esa solución en el código asociado con este video.

Pero no hay código asociado con ese video en el sitio web. Entonces, ¿cuál es la mejor solución?

Entiendo los beneficios de la reentrancia de los actores (como se discute en SE-0306). Por ejemplo, si descargamos cuatro imágenes, no queremos prohibir la reentrancia y perder la concurrencia de las descargas. En efecto, nos gustaría esperar el resultado de una solicitud duplicada anterior para una imagen en particular, y si no existe, iniciar una nueva descarga de imagen.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Según la información disponible, no se proporciona un ejemplo de código específico para la solución mejorada mencionada en el video “Proteger el estado mutable con Swift Actors” de WWDC 2021. Sin embargo, el video sugiere que la solución mejorada implicaría evitar descargas redundantes por completo.

    Para lograr esto, un enfoque podría ser implementar una cola de solicitudes que asegure que no se realicen solicitudes duplicadas para la misma imagen. Esto implicaría mantener una cola de solicitudes y verificar la cola cada vez que se realiza una nueva solicitud. Si ya existe una solicitud para una imagen específica en la cola, entonces la nueva solicitud simplemente esperará el resultado de la existente. Si no existe, la nueva solicitud se puede agregar a la cola y procesar.

    Al implementar una cola de solicitudes, se pueden evitar descargas redundantes y se pueden aprovechar los beneficios de la reentrancia del actor para garantizar una descarga eficiente y concurrente de imágenes.

Comments are closed.