web-dev-qa-db-ja.com

インメモリNSDataを参照するNSURLを作成できますか?

NSURLのドキュメント は次のように述べています:

NSURLオブジェクトは、リモートサーバー上のリソースの場所、ディスク上のローカルファイルのパス、または任意の部分を含む可能性のあるURLを表します。エンコードされたデータの

NSURLを介してリソースをロードしたいライブラリに渡したいメモリ内データのブロブがあります。確かに、最初にこのNSDataを一時ファイルに書き込んでから、そこからfile://NSURLを作成できますが、URLがそのバッファーを直接指すようにしたいです。私はすでに記憶に存在しています。

上で引用したドキュメントはこれが可能であることを示唆しているようですが、それを達成する方法のヒントを見つけることができません。私は何かが足りないのですか?

29
Ben Zotto

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

27

不足しているのはNSURLProtocolクラスです。約3ダースのコードが必要であり、URLを適切に処理するコードであれば、メモリ内のデータにアクセスできます。ドキュメントを読んでください。難しくはなく、サンプルコードが利用可能です。

残念ながら、NSURLをパラメーターとして受け取るAPIがいくつかありますが、処理できるのはファイルURLのみです。

5
gnasher729