¿Qué trucos hacen que una aplicación iOS se sienta receptiva?

Optimizaciones generales que te hacen más rápido:

  • Use Core Animation para su máximo beneficio. Esta es un área de la API de iOS que a veces los desarrolladores pueden entender mal.
  • Elementos de la interfaz de usuario de caché de forma inteligente. El indicador shouldRasterize en los objetos CALayer es una herramienta poderosa que elimina mucho dolor del almacenamiento en caché. Aprendelo, ámalo.
  • Comprender los comportamientos antes del almacenamiento en caché. Por ejemplo, el indicador shouldRasterize puede causar un impacto * negativo * en el rendimiento si se usa en vistas invalidadas con frecuencia.
  • El dibujo más rápido que puede hacer es una larga serie de llamadas de Core Graphics. Si se encuentra en un entorno extremadamente intensivo en rendimiento (las vistas de tabla pueden serlo), un conjunto de llamadas completamente plano en drawRect puede ser muchas veces más rápido que la implementación intuitiva de muchas subvistas y mucho trabajo de composición en el momento del renderizado.
  • Aprenda de la implementación UITableView y recicle objetos frecuentemente invalidados / creados. Cada alloc y dealloc es un rendimiento negativo, por lo que si va a hacer mucho, intente encontrar formas de reducir esta carga.
  • Mantenga el trabajo intensivo de la CPU fuera del hilo principal para minimizar su impacto en la capacidad de respuesta de la interfaz de usuario. dispatch_async es tu amigo, al igual que el resto de Grand Central Dispatch API.
  • No marque las vistas como opacas = NO a menos que realmente no sean opacas. Las vistas transparentes conllevan una penalización de rendimiento muy pronunciada.
  • Limite la cantidad de trabajo que realiza en layoutSubviews: manténgalo en el diseño. Muchas aplicaciones violan esto rutinariamente y ponen “trabajo real” en este método. En muchos lugares, layoutSubviews se puede llamar muchas veces seguidas. Evalúe si necesita o no hacer todo el trabajo allí, o si se puede trasladar a un lugar al que nadie y todos puedan llamar everyone

Cosas que no te hacen más rápido, pero que te gustan

  • Lazy-load liberalmente. Minimizar el tiempo entre una acción del usuario y una respuesta hace que su aplicación se sienta mucho más rápido. ¿Tiene una imagen en la vista que necesita cargar de forma remota? Muestre primero la vista y permita que el usuario interactúe con ella. Cargue la imagen en el fondo y sustitúyala una vez hecho.
  • Haga que toda la carga diferida sea evidente para el usuario. Evite las transiciones feas que rompen el contexto, como los elementos grandes de la interfaz de usuario que aparecen de repente. Usa animaciones generosamente, iOS es bueno en eso. En lugar de un elemento de interfaz de usuario sorpresa desagradable y desagradable, tienes una transición visceralmente satisfactoria que alivia el tiempo de espera.
  • Carga preventiva. Esto es especialmente importante para cualquier tipo de “transmisión infinita” (como sus feeds de Twitter o Facebook): no espere a que el usuario toque el fondo antes de cargar más. Observe el comportamiento del usuario: ¿están avanzando lentamente en la lista o están volando? Sintonice la agresión en su cargador predictivo en respuesta.
  • Dar una respuesta al usuario lo antes posible después de una interacción. Esto puede implicar lanzar grandes cargas pesadas a otro hilo, pero el retraso visible entre la acción y la respuesta hace que una aplicación se sienta positivamente horrible. Incluso si es solo un indicador de carga, es mejor que quedarse sentado sin hacer nada.
  • Asegúrese de que todos los elementos de la interfaz de usuario que responden a los toques * en realidad * respondan a los toques de manera visible. Nada es más frustrante que un elemento de la interfaz de usuario que se niega a mostrar que se ha interactuado con él.
  • Datos de caché para limitar las recargas. Considere centralizar su almacén de datos si tiene sentido. Por ejemplo, si una vista obtiene nuevos mensajes para un usuario y los muestra, almacénelos centralmente para que otras vistas relacionadas con la mensajería no tengan que emitir más solicitudes y puedan volverse interactivas de inmediato.
  • Las operaciones de red en segundo plano, minimizan el uso de la interfaz de usuario modal, en lugar de un indicador giratorio “funcionando …” que impide que el usuario haga cosas con la aplicación mientras espera, presente un indicador claro pero no impida que el usuario continúe. Esto es complejo y requerirá que encuentre una buena manera de manejar las solicitudes de red fallidas mucho después de que el usuario se haya alejado de la pantalla con la que se relaciona, pero vale la pena el esfuerzo.
  • Limite la profundidad de la IU. Una aplicación que esté perfectamente optimizada y siga * todas * las sugerencias anteriores aún se sentiría lenta si toma muchos golpes y transiciones para llegar de un lugar deseado al siguiente. Evite las pilas de controladores de navegación profunda, tardan una eternidad en salir, o al menos ofrecen una forma obvia de llegar a la cima de la pila. Cree IU más amplias y menos profundas en lugar de UI más estrechas y profundas.

En el momento en que se agrega a una aplicación de iOS, es importante que su aplicación tenga una excelente ejecución. Sus usuarios lo esperan, y perjudicará sus encuestas si su aplicación parece letárgica o moderada. Existen las siguientes formas que pueden hacer que una aplicación se sienta receptiva.

  • Use ARC para administrar la memoria: ARC permanece para el “Conteo de referencia programado” y, en consecuencia, se ocupa de los ciclos de retención / descarga en su código, por lo que no necesita hacerlo físicamente., ARC también puede mejorar su ejecución, garantizando que las preguntas se desasignan cuando ya no son necesarias.
  • Utilice un identificador de reutilización donde sea apropiado: para una mejor ejecución, la fuente de información de una vista de tabla debe reutilizar, en general, los objetos de celda de la vista de tabla de IU cuando reparte las celdas en la vista de tabla: celda para fila en ruta de índice: . Una perspectiva de tabla mantiene una línea o resumen de los artículos de celda de vista de tabla de IU que la fuente de información ha separado para su reutilización.
  • Establezca las vistas como opacas cuando sea posible : en el caso de que tenga perspectivas turbias, es decir, perspectivas que no se caracterizan por la sencillez, debe establecer su propiedad nebulosa en SÍ.
  • Trate de no bloquear el hilo principal : nunca debe hacer un trabajo realmente difícil en la cadena fundamental. Esto se debe a que UI Kit realiza la mayor parte de su propio trabajo en la cadena principal, por ejemplo, dibujando, supervisando toques y reaccionando para ingresar.
  • Tamaño de imágenes a vistas de imagen : en caso de que muestre una imagen del paquete de la aplicación en una vista de imagen de la interfaz de usuario, asegúrese de que la imagen y la vista de imagen de la interfaz de usuario tengan el mismo tamaño. Escalar imágenes sobre la marcha puede ser costoso, especialmente si su Vista de imagen de UI está implantada en una Vista de desplazamiento de UI.
  • Elija la colección correcta : descubrir cómo utilizar la clase más adecuada o protestar por la carga de trabajo actual es esencial para componer un código efectivo. Esto es particularmente genuino cuando se manejan acumulaciones.
  1. Exposiciones: Resumen ordenado de cualidades. Búsqueda rápida por registro, moderada a búsqueda por calidad, moderada para incrustar / borrar.
  2. Referencias de palabras: Almacenar conjuntos de claves / estimación. Búsquedas rápidas por clave.
  3. Conjuntos: Resumen de cualidades no solicitado. Búsqueda rápida por calidad, rápida para incrustar / borrar.
  • Potenciar la compresión GZIP : una cantidad enorme y en desarrollo de aplicaciones depende de la información externa de servidores remotos u otras API externas. Tarde o temprano agregará a una aplicación que descarga información en XML, JSON, HTML o alguna otra organización de contenido.
  • Reutilizar y vistas de carga diferida : más perspectivas significan más dibujos; lo que finalmente significa más sobrecarga de CPU y memoria. Esto es particularmente genuino si su aplicación inserta numerosas perspectivas dentro de una Vista de desplazamiento de la interfaz de usuario. El secreto para lidiar con esto es reflejar la conducta de la Vista de tabla de UI y la Vista de colección de UI: no realice todas las subvistas sin demora de un momento. En cambio, cree sus perspectivas cuando las necesite, agregándolas a una línea de reutilización cuando haya terminado con ellas.
  • Reserva, caché, caché : una pauta general increíble al agregar a su aplicación es “reservar lo que es importante”, es decir, cosas que no son realistas para cambiar, sin embargo, se obtienen con la mayor frecuencia posible.
  • Considere dibujar : hay algunos enfoques para hacer capturas de aspecto extraordinario en iOS. Puede utilizar imágenes estimadas completas, imágenes redimensionables, o puede hacer todo el recorrido y dibujarlo físicamente utilizando CALayer, Core Graphics o incluso Open GL.
  • Manejar advertencias de memoria : iOS aconseja a todas las aplicaciones en ejecución cuando la memoria del marco se está agotando. Esto es lo que dice la documentación oficial de Apple con respecto a la precaución de poca memoria:
  • Reutilice objetos caros : para mantener una distancia estratégica de los cuellos de botella de ejecución cuando trabaje con estos artículos, intente reutilizar estos elementos si es posible. Puede hacerlo agregando una propiedad a su clase o haciendo una variable estática.
  • Mantenga una distancia estratégica de Reprocesamiento de datos: Numerosas aplicaciones hacen llamadas de información de servidores remotos para obtener los datos que la aplicación requiere para funcionar. Esta información la mayoría de las veces se ejecuta en posición JSON o XML. Es vital intentar y utilizar la misma estructura de información en ambos acabados mientras se solicita y obtiene la información.
  • Elija el formato de datos correcto : hay muchas maneras de intercambiar información a su aplicación desde una administración web, pero las dos más conocidas son JSON y XML. Debe asegurarse de elegir la correcta para su aplicación.
  • Imágenes de fondo adecuadamente : de la misma manera que otras cosas diferentes en la codificación de iOS, no hay menos de dos enfoques distintos para poner una imagen básica en su perspectiva:
  1. Puede configurar el sombreado de la experiencia de su perspectiva en un sombreado hecho con el sombreado de color de la interfaz de usuario con imagen de patrón.
  2. Puede agregar una subvista Vista de imagen de la IU a la perspectiva

Disminuya su huella web : la vista web de la interfaz de usuario es extremadamente útil. Es fácil mostrar contenido web, o incluso hacer una parte visual de su aplicación que sería problemática con los controles estándar del kit de interfaz de usuario.

  • Elija la opción correcta de almacenamiento de datos: ¿Cuáles son sus opciones con respecto a guardar y examinar conjuntos de información extensos? Tiene algunas alternativas, que incluyen:
  1. Almacénelos utilizando los valores predeterminados de usuario de NS
  2. Recuperación a un documento organizado en posición de lista XML, JSON o P
  3. Documento utilizando la codificación NS
  4. Recuperación a una base de datos SQL cercana, por ejemplo, SQ Lite
  5. Usar datos básicos.
  • Acelere el tiempo de lanzamiento : Impulsar su aplicación rápidamente es vital, particularmente cuando el cliente despacha de manera sorprendente. ¡Las primeras presentaciones significan una medida considerable para una aplicación!

Consulte Appsuch.com para ver las instalaciones de su aplicación móvil.

Aquí hay algunos básicos:

  • Evite usar el hilo principal para procesos que realmente no necesitan actualizaciones en la interfaz de usuario, como leer y escribir en archivos, analizar un feed, etc.
  • Debe haber algo de contenido en la pantalla en todo momento, en la medida de lo posible, incluso si el contenido está obsoleto y hay una actualización de feed en segundo plano.

Aquí hay una buena publicación sobre cómo Facebook hizo que su nueva aplicación fuera tan rápida.
http://nathanbarry.com/ux-lesson

Si tuviera que llevar a casa una línea de aprendizaje de esto, tomaría esta:

“La velocidad no se trata solo de tiempos de carga. En cambio, tiene que ver con la percepción de los usuarios de qué tan rápido la aplicación está reaccionando a sus comandos”

Asegúrese de que nunca haya un momento en su aplicación en el que un botón o control no responda debido a algún procesamiento. Use hilos de fondo. El marco Cocoa de Apple ha hecho que sea bastante fácil para los desarrolladores aprovechar el poder de los subprocesos múltiples sin requerir un conocimiento profundo de cómo funcionan los subprocesos.

Además de estos, hay algunos consejos que debe tener en cuenta al construir la interfaz de usuario:

  • Utilice vistas opacas siempre que sea posible, especialmente en las celdas de vista de tabla. Para las vistas que se representan con un fondo de color claro, el sistema tiene que calcular realmente su color a partir de la vista debajo de él. Esto ralentiza la velocidad de desplazamiento de las celdas de vista de tabla en un grado considerable.
  • Es una mejor idea dibujar contenido en las celdas de vista de tabla, en lugar de agregar UILabels de Subvista o cualquier UIViews para el caso.

Muchas de estas respuestas son excelentes. Agregaré algunos consejos propios:

  • La decodificación de imágenes JPEG en el subproceso principal provocará un rendimiento de desplazamiento deficiente. Evite [UIImage imageWithData:] y haga una llamada a CGImageCreateWithJPEGDataProvider en una cola en segundo plano para forzar que la operación de decodificación se produzca fuera del hilo principal. ¡Recuerda guardar en caché las imágenes decodificadas!
  • Renderizar celdas muy altas (especialmente cuando se rellenan con elementos CoreText) puede causar grandes picos de actividad y agitación de la IU. Considere crear una mayor cantidad de celdas más cortas para distribuir su trabajo a lo largo del tiempo y mantener altas las tasas de cuadros.
  • Anticipe el trabajo que deberá realizarse en el futuro cercano. ¿Se está desplazando el usuario? Comience a representar asincrónicamente las próximas celdas antes de que su vista de tabla las solicite.
  • UIScrollView tendrá, de forma predeterminada, retrasosContentTouches establecidos en SÍ. Esto provoca un retraso notable al tocar un botón dentro de la vista de desplazamiento. Considere anular este comportamiento. Establezca retarysContentTouches en NO e implemente un retraso táctil más corto usted mismo.
  • Ansiosas imágenes de carga. No espere a que aparezca una vista de imagen en pantalla para comenzar a cargar su imagen desde la red. Sin embargo, recuerde priorizar las imágenes en pantalla sobre las imágenes fuera de pantalla. Las prioridades de NSOperationQueue lo hacen fácil.
  • Evita los datos básicos. Use NSCoding para escribir objetos en un archivo y volver a leerlos. Es mucho más rápido que usar un ManagedObjectContext y funciona bien si todo lo que necesita es persistencia básica.
  • la aplicación responde inmediatamente a la interacción del usuario: tocar un botón muestra inmediatamente un “estado presionado”; pellizcar la pantalla mostraría al usuario que algo está por suceder;
  • la aplicación no deja de responder mientras está ocupada cargando algo, y el usuario no se queda atascado en esa pantalla, pudiendo interactuar con otras partes de la aplicación;
  • en caso de un tiempo de carga elevado, se le presenta al usuario una barra de progreso, de esta manera él sabe cuánto tiempo le queda para tener acceso al contenido completo.

En una vista de tabla con celdas que consta de múltiples vistas secundarias, será lento. Por ejemplo, un cliente de Twitter puede tener celdas con avatares, texto, fecha, nombres de usuario, etc.

En cambio, renderice esos elementos en una sola imagen y luego haga una vista de tabla de celdas que contengan solo la imagen plana.

Este fue el truco que Lauren Brichter usó en Tweetie.

Agregar una sombra en iOS es tan fácil como hacerlo:

[myView.layer setShadowOpacity: 0.5]

sin embargo, esto causa algunos problemas de rendimiento graves cuando intenta animar esta vista. Esto se debe a que el cálculo de la sombra paralela para su vista requiere que Core Animation realice un costoso pase de representación fuera de pantalla para determinar la forma exacta de su vista a fin de descubrir cómo representar su sombra paralela.

Arreglar esto es relativamente fácil, todo lo que tiene que hacer es agregar una línea de código adicional:

[myView.layer setShadowPath: [[UIBezierPath
bezierPathWithRect: myView.bounds] CGPath]];

Básicamente, esto proporciona a Core Animation cierta información sobre la forma de su vista para ayudarlo a dibujar.

Tuve un problema al agregar una sombra en un UITableViewCell y, sin el truco anterior, desplazar el UITableView me da 20-30 FPS, después de agregar esa línea de código, el desplazamiento es suave como la mantequilla (55-60 FPS).

* Reutilice celdas de fila de tabla en vistas de tabla
* Cargar imágenes incrustadas de forma asincrónica
* Siempre tenga algún tipo de cambio visible en respuesta a los toques (como un cambio de color para una fila de la tabla)

Una de las mejores que he escuchado es comenzar a subir imágenes inmediatamente después de que alguien las tome. Es una especie de truco de UI cuando una persona hace clic en el botón para enviarlo a una red social. Creo que lo único que hace es hacerlo visible. Quiero decir que Instagram funciona de esta manera, pero no estoy al 100%.

Grandes consejos de optimización proporcionados por Jerry Wong y Ryan Gomba. Creo que antes de saltar a implementar estos, un buen primer paso es ver qué partes de una aplicación tienen los peores problemas de capacidad de respuesta … es encontrar dónde están los cuellos de botella.

Ahora hay una manera de recopilar este tipo de datos de los usuarios en la naturaleza. Según el siguiente informe del servicio Pulse.io Mobile App Performance Monitoring, esta aplicación en particular tiene una congelación aguda de 8 segundos (es decir, baja velocidad de fotogramas) durante el inicio de la aplicación. Además, optimizar el rendimiento después de los eventos táctiles SPView y HCButton contribuirá en gran medida a reducir las congelaciones dada la frecuencia con la que ocurren.


Este es un enfoque basado en datos para optimizar la capacidad de respuesta y los cuellos de botella de la aplicación. No es una actividad única sino un proceso continuo. Es difícil adivinar los principales problemas de capacidad de respuesta que tendrá una nueva versión de una aplicación, especialmente dado que las aplicaciones de los teléfonos antiguos se ejecutan.

Hay muchas maneras de hacer que una aplicación iOS responda.

  • Evite utilizar la cadena principal para formularios que generalmente no requieren actualizaciones en la interfaz de usuario, como leer y escribir en registros, analizar un sostenido, etc.
  • Debe haber algún Contenido en la pantalla constantemente en la medida probable

  • Es mejor planear dibujar contenido en las celdas de la vista de tabla, en lugar de incluir la etiqueta de la interfaz de usuario de visualización secundaria o cualquier interfaz de usuario, en lo que respecta a eso
  • Debes usar la animación principal para tu ventaja más extrema
  • Acelerar el tiempo de lanzamiento
  • Elija la opción correcta de almacenamiento de información
  • Tamaño de imágenes para ver imágenes
  • Intenta no bloquear el hilo principal

Creo que también debemos enfatizar la importancia de detectar gestos que no responden (como: toques, deslizamientos) en su aplicación. Al diseñar su aplicación para que se ajuste a las muchas pantallas, es posible que encuentre cierta confusión de los usuarios con respecto a los gestos a los que pueden estar acostumbrados con otras aplicaciones cuando usan la suya. Debido a que tales gestos como inclinar, sacudir, tocar dos veces y rotar todavía están en su infancia gestual, puede causar cierta confusión al usar su aplicación que podría frustrar al usuario.

Una forma de detectar gestos que no responden es integrar una solución analítica visual en la aplicación en su aplicación. Por ejemplo, la captura de pantalla tomada directamente de la plataforma Appsee Mobile Analytics (donde trabajo) muestra una pantalla de compras y, como lo indica la función Touch Heatmap, el usuario toca un producto sin respuesta de la aplicación. Esto entra en conflicto con el deseo de los editores de que el usuario pueda realizar una compra en la aplicación y resalta un problema crítico de usabilidad que causa frustración al usuario. La solución de este problema de usabilidad al permitir toques en el producto y dirigir al usuario a la pantalla de pago aumentará drásticamente las compras en la aplicación.

Sugeriré usar Lazy Loading. Lazy Loading Images es una técnica para resolver la carga de imágenes desde la web. Lo que pasa es que necesito mostrar imágenes directamente desde la web en UIImageView o cualquier otro control.

¿Cómo funciona Lazy Loading?
Configure la imagen usando el método incorporado de imagen de imagen, luego su aplicación se atascará al cargar la imagen desde la web. Para superar este problema, existe una técnica generalmente conocida como Lazy Loading Image. Lo que realmente sucede en la carga diferida es que la tarea de cargar imágenes desde la web se realiza en segundo plano y en ese momento se muestra una imagen de marcador de posición temporal en el control. Cuando la imagen real se carga completamente desde la web, se reemplaza con la imagen del marcador de posición y obtiene su imagen real en el control sin tener una interfaz atascada.

Para desarrollar una aplicación, consulte el enlace de referencia dado.

Referencia:

Tutorial de imágenes de carga lenta de iOS

¿Tiene algunas tareas de larga duración que están relacionadas o dependen de la finalización de los demás? Considere usar nsoperationqueue y envolver su trabajo en nsoperations, al hacerlo puede controlar la velocidad a la que realiza el trabajo. Muy útil para limitar los recursos de red entre wifi / 3G / edge

Si utiliza muchas imágenes en una aplicación tipo galería, como fotos, intente generar miniaturas en la primera carga (en el fondo) y cargue la miniatura en su lugar hasta que el usuario se enfoque en la imagen. ImageIO es tu amigo aquí. Esta técnica funciona muy bien en vistas de tabla.

No hay trucos solo para mejorar sus conocimientos y habilidades de programación.
Cuando conoces iOS de arriba abajo. Sabrás cómo elegir el arma adecuada para la tarea correcta.

No uses AIR