Pregunta

Tengo una pregunta acerca anulando métodos de acceso generados automáticamente. El siguiente no funcionaría (creo) porque cada uno referencias getter otro captador. ¿Hay una regla que los métodos de descriptor de acceso no deben utilizar otros métodos de acceso, o no sólo hay que mirar hacia fuera para estas situaciones de forma individual?

-(UIImage *) image{

    if(image == nil){
        if(self.data == nil){
            [self performSelectorInBackground: @selector(loadImage) withObject: nil]
        }else{
            self.image = [UIImage imageWithData: self.data];
        }
    }

    return image;
}

-(NSData *) data {

    if(data == nil){
        if(self.image == nil){
            [self performSelectorInBackground: @selector(loadData) withObject: nil]
        }else{
            self.data = UIImageJPEGRepresentation(self.image, 0.85);
        }
    }

    return data;
}

Tengo que destacar que la utilización de la imagen que aquí se presenta es un ejemplo, y pensamientos respecto a lo que hay que hacer en este ejemplo particular son menos importantes que en el caso general.

¿Fue útil?

Solución

En primer lugar, no ser demasiado inteligente para su propio bien. Si desea obtener más de algún cuello de botella, primera medida y asegurarse de que es realmente allí. Creo que tanto UIImage y NSData hacer algo de carga diferida interna, por lo que el código podría ser esencialmente inútil. En segundo lugar, incluso si realmente quería hacer algo como esto a mano, trate de dividir el código de almacenamiento en caché en una clase separada, de modo que no contaminan el código de la clase principal.

No hay una regla sobre descriptores de acceso (al menos no que yo sepa), porque las personas no hacen mucho la carga diferida en descriptores de acceso. A veces me pongo a mí mismo atrapado por un bucle sin fin causada por [UIViewController loadView] perezoso en combinación con [UIViewController view], pero eso es todo.

Otros consejos

No hay nada que lo prohíbe, pero definitivamente escribir algo de código confuso. En esencia, estas dos propiedades tienen una dependencia circular. Esto es difícil de tanto leer y depurar. No está claro por qué te gustaría a "cargar los datos" antes de "cargar la imagen", o por qué también querría apoyo "cargar la imagen" antes de "cargar los datos", o realmente cómo las dos propiedades son en realidad dos cosas diferentes.

lo que en realidad estás haciendo en este ejemplo podría tomar mucho tiempo para la carga; lo mejor es asegurarse de que es seguro para hilos.

Por otra parte, sería aún mejor si ha realizado el objeto de datos de un proveedor de datos real (normalmente a través de protocolos), separado de la clase, y para hacer que el contenedor de la imagen a exponer que está manejando un objeto cargados de forma liviana (que puede causar protesta de algunas personas).

específicamente, es posible que desee invocar una carga de datos / imagen desde el proveedor, llamaremos a partir de awakeFromNib (por ejemplo) - (. Especialmente si descargado) a continuación, el cargador se escurre y carga los datos en un subproceso secundario. dar el proveedor de datos de una devolución de llamada para informar a la opinión de que la imagen está lista (normalmente a través de protocolos). una vez que el punto de vista toma la imagen no archivada, invalidar el proveedor de datos.

Por último, si usted está tratando con recursos de la aplicación, el 'sistema' va a almacenar en caché algunos de esto para usted taaan que estaría tratando de trabajo en contra de lo que ya está optimizado detrás de las escenas.

en resumen, es por lo general bien (inicialización, por ejemplo, no perezoso) -. Pero este diseño específico (como dijo otro cartel) tiene una dependencia circular que debe ser minimizado

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top