我可以创build一个指向内存NSData的NSURL吗?

NSURL的文档声明:

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

我有一堆内存数据,我想交给一个想通过NSURL加载资源的库。 当然,我可以先写这个NSData到一个临时文件,然后创build一个file:// NSURL ,但是我宁愿让这个URL直接指向我已经在内存中存在的缓冲区。

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

NSURL支持data:// URL-Scheme( RFC 2397 )。
这个scheme可以让你build立URL的forms

 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编码的性质,将大数据二进制blob与数据URL进行传递可能会有点低效。

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

你缺less的是NSURLProtocol类。 需要大约三十行代码,并且正确处理URL的任何代码都可以访问您的内存数据。 阅读文档,这并不难,并有示例代码可用。

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