我能否创建一个NSURL来引用内存中的NSData



NSURL的文档说明:

一个NSURL对象表示一个URL,该URL可能包含远程服务器上资源的位置,上的本地文件的路径

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

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

NSURL支持data://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

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

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

最新更新