2012-02-20 1482 views
6

¿Cuál sería la forma más elegante de recibir datos de una API JSON de transmisión mediante AFNetworking? AFNetworking proporciona una excelente compatibilidad para recibir datos que no provienen de las API de JSON, pero no pude encontrar ningún ejemplo de transmisión de JSON.Streaming JSON con AFNetworking en IOS

+0

¿Alguna vez ha funcionado algo así? –

+0

Por lo que recuerdo, logré implementar un ejemplo de transmisión JSON muy simple, pero muy pronto mi interés en el proyecto IOS lo necesité (por ejemplo, un cliente CampFire). Desafortunadamente, nada salió de esto. :) – akisaarinen

+0

Bastante justo. ¡Gracias por la actualización! –

Respuesta

12

AFNetworking no tiene una operación integrada de estilo JSON de transmisión tipo SAX, pero debería ser sencillo crear la suya propia.

  • crear una subclase de AFJSONRequestOperation
  • Utilice la propiedad outputStream de la operación durante la inicialización para conectarlo a un analizador JSON que apoya el análisis de estilo SAX (como Yajl). El analizador leerá los datos y construir el objeto JSON ya que viene en
  • Conexión por la propiedad responseJSON para leer el objeto en caché desde el analizador
  • ... o dependiendo de cómo lo está haciendo streaming, es posible que necesite para agregar una nueva propiedad que define un bloque para ejecutar cuando vuelven nuevos objetos JSON (por ejemplo, setReceivedJSONBlock:((^)(void (id JSON))block). Este bloque probablemente se desencadenará mediante métodos delegados enviados desde el analizador (por ejemplo, <YAJLParserDelegate> -parserDidEndDictionary:).

Si puede hacer que esto funcione, le animo a que publique y comparta esto con otros. Creo que esto podría ser útil para muchas personas.

+1

¡Gracias por la respuesta, probaré el enfoque sugerido! – akisaarinen

+2

Esto no va a funcionar tan fácilmente con AFNetworking. Primero, el método de AFURLConnectionOperation -connection: didReceiveData: no está implementado correctamente. Solo funciona para transmisiones que siempre consumen TODOS los bytes proporcionados por la conexión. Esto incluye secuencias de archivos y secuencias de memoria. Sin embargo, para "conectar" la API de transmisión de un analizador con NSURLConnectionDelegate es necesario un enfoque más elaborado que implique algún tipo de "cola síncrona" como medio para transportar los datos y una secuencia emparejada que tenga un búfer de tamaño fijo. – CouchDeveloper

+0

¿Puedes explicar un poco más sobre esto? ¿Cómo conectar outputStream al analizador JSON? –

Cuestiones relacionadas