NSURL对象表示可能包含的URL 远程服务器上资源的位置,本地文件的路径 磁盘,甚至 任意一段编码数据。
我有一大堆内存数据,我想把它交给想要通过NSURL
加载资源的库。当然,我可以先将此NSData
写入临时文件,然后从中创建file://
NSURL
,但我更喜欢将URL直接指向已经存在的缓冲区在记忆中存在。
上面引用的文档似乎表明这是可能的,但我找不到任何如何实现它的暗示。我错过了什么吗?
答案 0 :(得分:27)
NSURL
支持数据:// URL-Scheme(RFC 2397)
此方案允许您以
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。