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

时间:2014-05-14 01:25:16

标签: ios cocoa nsdata nsurl

The docs for NSURL声明:

  

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

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

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

2 个答案:

答案 0 :(得分:27)

NSURL支持数据:// URL-Scheme(RFC 2397) 此方案允许您以

的形式构建URL
data://data:MIME-Type;base64,<data>

一个可行的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];

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

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

答案 1 :(得分:5)

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

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