ios cocoa nsdata nsurl

ios - ¿Puedo crear un NSURL que haga referencia a NSData en memoria?



cocoa (2)

Los documentos para NSURL establecen que:

Un objeto NSURL representa una URL que potencialmente puede contener la ubicación de un recurso en un servidor remoto, la ruta de un archivo local en el disco, o incluso una pieza arbitraria de datos codificados .

Tengo un blob de datos en memoria que me gustaría entregar a una biblioteca que quiere cargar un recurso a través de un NSURL . Claro, primero puedo escribir este NSData en un archivo temporal y luego crear un file:// NSURL partir de eso, pero preferiría que la URL apunte directamente al búfer que ya tengo presente en la memoria.

Los documentos citados arriba parecen sugerir que esto es posible, pero no puedo encontrar ningún indicio de cómo lograrlo. ¿Me estoy perdiendo de algo?


Lo que te falta es la clase NSURLProtocol. Toma alrededor de tres docenas de líneas de código, y cualquier código que maneje las URL correctamente puede acceder a sus datos en memoria. Lea la documentación, no es difícil y hay un código de muestra disponible.

Desafortunadamente, hay algunas API que toman un NSURL como parámetro, pero solo pueden manejar URL de archivos.


NSURL soporta los datos: // URL-Scheme ( RFC 2397 ).
Este esquema te permite construir URLs en la forma de

data://data:MIME-Type;base64,<data>

Un ejemplo de trabajo de Cocoa sería:

NSImage* img = [NSImage imageNamed:@"img"]; NSData* imgData = [img TIFFRepresentation]; NSString* dataFormatString = @"data:image/png;base64,%@"; NSString* dataString = [NSString stringWithFormat:dataFormatString, [imgData base64EncodedStringWithOptions:0]]; NSURL* dataURL = [NSURL URLWithString:dataString];

Pasar por grandes binarios binarios con URL de datos puede ser un poco ineficaz debido a la naturaleza de la codificación base64.

También puede implementar un NSURLProtocol personalizado que se NSURLProtocol específicamente de sus datos. Apple tiene algún código de ejemplo que utiliza un protocolo personalizado para pasar objetos de imagen: https://developer.apple.com/library/mac/samplecode/SpecialPictureProtocol/Introduction/Intro.html#//apple_ref/doc/uid/DTS10003816