2011-11-20 7 views
5

Realizo una aplicación que accede a algunos datos en el primer lanzamiento y luego la muestra. He estado descargando esta información de esta manera:¿DataWithContentsOfURL está dañado al iniciar la aplicación?

NSData *data = [NSData dataWithContentsOfURL:url]; 

¿Esto es malo? En este momento he establecido el método que lo contiene para que se ejecute en un hilo de fondo usando GCD, pero escuché que dado que dataWithContentsOfURL es sincrónico, es malo. ¿Hay alguna opinión sobre esto?

+0

@bryanmac Utilice la etiqueta grand-central-dispatch para las preguntas de Apple GCD. –

Respuesta

5

Es malo si lo ejecuta en el hilo principal de la IU. Eso bloqueará la capacidad de respuesta de tu aplicación, que es mala, pero es aún peor al inicio.

Tiene que hacerlo asíncrono. Puede hacerlo ejecutando ese método en una cadena de fondo (GCD dispatch_async) o utilizando métodos asincrónicos de NSUrlConnection.

He aquí un ejemplo del uso de GCD para trabajar en el fondo y luego actualizar la interfaz de usuario (después de hecho) en el hilo principal:

GCD, Threads, Program Flow and UI Updating

Otra opción es el método asíncrono de NSURLConnection. Ver los métodos initWithRequest aquí:

http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSURLConnection_Class/Reference/Reference.html

+0

Al ejecutarlo en un hilo de fondo usando GDC, ¿eso va a ser un problema? – Yep

+0

recién editado: puede ejecutarlo con GCD. Agregaré algunos punteros. – bryanmac

+1

Lo hice de esta manera: 'dispatch_async (dispatch_get_global_queue (DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),^{ // hago algo });' – Yep

3

Estás a salvo, siempre y cuando se está ejecutando en un subproceso en segundo plano.
La idea de que la carga síncrona es mala solo es válida para el subproceso principal de la interfaz de usuario. Una operación de larga ejecución en el subproceso principal de la interfaz de usuario hará que su aplicación no responda. Hacerlo en el fondo es la forma correcta de hacerlo. Además, considere usar:

+dataWithContentsOfURL:options:error: 

para que pueda recuperar un error si algo sale mal.

Cuestiones relacionadas