NSURL
的文档说明:
一个NSURL对象表示一个URL,该URL可能包含远程服务器上资源的位置,上的本地文件的路径
我有一坨内存中的数据,我想交给一个想要通过NSURL
加载资源的库。当然,我可以首先将此NSData
写入临时文件,然后从中创建file://
NSURL
,但我更愿意将URL直接指向我已经在内存中存在的缓冲区。
上面引用的文档似乎表明这是可能的,但是我找不到任何关于如何完成它的提示。我错过什么了吗?
NSURL
支持data://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
您缺少的是NSURLProtocol类。大约需要36行代码,任何正确处理url的代码都可以访问内存中的数据。阅读文档,这并不难,并且有可用的示例代码。
不幸的是,有一些api将NSURL作为参数,但只能处理文件url。