我可以创建一个引用内存NSData的NSURL吗?

Ben*_*tto 29 cocoa nsurl nsdata ios

国家的文件NSURL说:

NSURL对象表示可能包含远程服务器上资源位置的URL,磁盘上本地文件的路径,甚至是任意一段编码数据.

我有一大堆内存数据,我想把它交给一个想要通过一个资源加载资源的库NSURL.当然,我可以先将它写入NSData临时文件,然后创建一个file:// NSURL,但我更喜欢让URL直接指向我已经存在于内存中的缓冲区.

上面引用的文档似乎表明这是可能的,但我找不到任何如何实现它的暗示.我错过了什么吗?

Tho*_*ing 28

NSURL支持data:// URL-Scheme(RFC 2397).
此方案允许您以.的形式构建URL

data://data:MIME-Type;base64,<data>
Run Code Online (Sandbox Code Playgroud)

一个可行的Cocoa示例是:

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];
Run Code Online (Sandbox Code Playgroud)

由于base64编码的性质,使用数据URL传递大型二进制blob可能有点低效.

您还可以实现专门处理数据的自定义NSURLProtocol.Apple有一些示例代码使用自定义协议来传递图像对象:https://developer.apple.com/library/mac/samplecode/SpecialPictureProtocol/Introduction/Intro.html#//apple_ref/doc/uid/DTS10003816


gna*_*729 5

您缺少的是NSURLProtocol类.需要大约三十行代码,任何正确处理URL的代码都可以访问内存中的数据.阅读文档,这并不困难,并提供示例代码.

不幸的是,有些API将NSURL作为参数,但只能处理文件URL.