Método -item de UIActivityItemProvider: ¿espera una connection NSURLC?

Tengo una subclass UIActivityItemProvider que supuestamente debe proporcionar un NSURL al UIActivityViewController haciendo lo siguiente:

  • Subir una image a mi server
  • Recibir una URL del server
  • Proporcione esa URL a los participantes.

Parecía bastante sencillo en teoría: configurar el método placeholderItem para devolver un NSURL ficticio, y luego configurar toda la lógica para manejar la carga, etc. en el método del item .

El problema es que el método del item es un método único y sincrónico al que se llama en un hilo de background y se supone que debe manejar todo el procesamiento y devolver un elemento (en este caso, un NSURL ) … y los methods que necesito usar para manejar la carga son asíncronos (es decir, creo una NSURLConnection con la subclass UIActivityItemProvider como su delegado, respondo a sus methods de delegado para actualizar mi UI con un indicador de progreso, etc.) pero no puedo hacer eso dentro del método de item porque no puedo permitir que el item regrese hasta que tenga su URL.

Mi bash de solución fue hacer que el método del item desencadene la connection de URL y luego saltar a este ciclo:

  while ((self.uploadedFileURL == nil) && (self.uploadErrorMessage == nil)) { [NSThread sleepForTimeInterval:1.0f]; NSLog(@"Waiting for upload..."); } 

y luego confío en los diversos methods de delegado de NSURLConnection para actualizar el progreso, etc. En los methods de delegado didFinishLoading y didFailWithError , doy valores a self.uploadedFileURL y self.uploadErrorMessage , respectivamente.

Pero: esto no funciona. La NSURLConnection nunca dispara un método de delegado, y debo asumir que está bloqueado por alguna razón. Recibo un "Esperando carga …" en el logging cada segundo como lo esperaba, pero no sucede nada más.

¿Que me estoy perdiendo aqui?

actualización: he encontrado una solución de tipo, pero no es lo ideal: usar una request síncrona en el método -item . La gran desventaja es que no puedo mostrar un indicador de progreso, y no hay un buen event handling los errores de networking. Entonces … Sigo buscando una mejor manera.

OK, entonces descubrí una solución bastante buena. La siguiente información proporciona una variante pseudo-síncrona de los methods NSONLConnection:

https://gist.github.com/SQiShER/5009086

"Pseudo-sincrónico" en que los methods que proporciona devuelven sus valores sincrónicamente, pero están utilizando los methods asynchronouss en el back-end. Estoy seguro de que ese no es un término legítimo, pero es todo lo que tengo 🙂

De todos modos, el código en el enlace responde a algunos pero no a todos los methods de delegado de nsurlconnection … Sin embargo, es trivial agregar más. Si alguien ve esto y quiere más detalles, comenta y me tomaré el time para completar esta respuesta.

Puede intentar usar una subclass de UIActivity en UIActivity lugar. Anular -[UIActivity performActivity] y comenzar a download allí. Una vez que haya terminado de usar

 [self activityDidFinish:YES]; 

continuar.