¿Qué encontrarás en este post?
ToggleUIScrollView para los mayores
El ejemplo del día era una app que mostraba imágenes mastodónticas en una UIScrollView y, lógicamente, funcionaba como el culo. Se trataba de ir mejorándola poco aplicando distintas técnicas. El principal cuello de botella era dibujar la imagen en pantalla, y como todos sabemos UIKit no es seguro en multitarea, así que hacerlo en 2º plano pintaba chungo. Sin embargo, lo que sí se puede hacer en segundo plano es dibujarla en un CGContextRef y posteriormente pasar eso a pantalla. Es decir, se trataba de usar un buffer fuera de pantalla, técnica vieja conocida de los programadores de videojuegos.Programación iOS en el BNR
Programación concurrente con NSOperation & NSOperationQueue La primera aproximación consistía en dibujar fuera de la pantalla en segundo plano usando NSOperation & NSOperationQueue. Previamente nunca le había prestado mucha atención a esas dos, ya que me parecían relíquias del pasado comparado con GCD (Grand Central Dispatch). NSOperation & NSOperationQueue vs Grand Central Dispatch (GCD) En realidad NSOperation & NSOperationQueue son alternativas de más alto nivel y que usan GCD. La gran ventaja que tienen es que puedes cancelar operaciones pendientes sin hacer tener que hacer chapuzas (basta con mandar un mensaje y ya está). La recomendación oficial de Apple, según Jonathan Saggau, es usar las primeras si puedes, y sino, usar GCD. En realidad, me sigue gustando más GCD y me parece más práctico, así que creo que seguirá siendo mi primera opción. UIScrollView sigue más lenta que el caballo del malo: CALayer al rescate Tras repasar la app con Instruments, estaba claro que aunque había una gran mejora, seguía necesitando una ayuda. Por lo visto, la UIView estaba tardando mucho en pintar la imagen, así que pasamos a usar la CALayer subyacente. Además, CALayer tiene un método que permite copiar directamente el CGContextRef. En ese momento ya lo podíamos dejar por bueno y pasar a otra cosa.Avisos de memoria que no llegan Algo inquietante y que conviene que sepáis, es que si el usuario está interactuando con la app y consumes mucha memoria, no recibirás los avisos de memoria. Tu app podría irse al pedo sin aviso previo. En esos casos no queda más remedio que comprobar tú mismo el uso de memoria y enviarte a ti mismo tus propios avisos. 🙁