我可以创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。