UIScrollView, NSOperationQueue, GCD y más: 2º día de programación iOS en el BNR

Autor: | Última modificación: 7 de marzo de 2024 | Tiempo de Lectura: 2 minutos
Temas en este post: ,

UIScrollView 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. 🙁

Modernizar código antiguo

La app en cuestión estaba programada de forma bastante anticuada, sin propiedades y con gestión de memoria manual. La idea era actualizarla, incluyendo el usar el «refactor» de Xcode llamado «port to ARC» o algo así. El resultado ha sido un desastre, el puto Xcode se colgó (¡sorpresa!) no sin antes desgraciar el código en el que había estado trabajando todo el día. AL final tuve que recuperar todo y adaptarlo a mano: nunca, nunca dejeis que Xcode modifique vuestro código sin antes hace runa copia de seguridad.

Parseado de JSON con iOS5

No lo sabía, pero iOS5 tiene clases propias para parsear JSON, así que toca olvidarse de la librería de Brautaset. Hicimos algunos ejemplos usando la API de GitHub, una especie de visor de su timeline. No tenía idea de la existencia de esta API  y la voy a usar en mis propios cursos.