Подтвердить что ты не робот

Могу ли я создать NSURL, который ссылается на NSData в памяти?

Документы для NSURL указывают, что:

Объект NSURL представляет собой URL-адрес, который потенциально может содержать расположение ресурса на удаленном сервере, путь локального файла на диск или даже произвольный фрагмент закодированных данных.

У меня есть blob данных в памяти, которые я хотел бы передать библиотеке, которая хочет загрузить ресурс с помощью NSURL. Конечно, я могу сначала записать этот NSData в временный файл, а затем создать из него file:// NSURL, но я предпочел бы, чтобы URL-адрес указывал непосредственно на буфер, который я уже присутствовал в памяти.

Представленные выше документы, похоже, предполагают, что это возможно, но я не могу найти никакого намека на то, как это сделать. Я что-то пропустил?

4b9b3361

Ответ 1

NSURL поддерживает данные://URL-схема (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];

Передача больших двоичных блоков с URL-адресами данных может быть немного неэффективной из-за характера кодирования base64.

Вы также можете реализовать пользовательский NSURLProtocol, который специально касается ваших данных. У Apple есть пример кода, который использует собственный протокол для передачи объектов изображения: https://developer.apple.com/library/mac/samplecode/SpecialPictureProtocol/Introduction/Intro.html#//apple_ref/doc/uid/DTS10003816

Ответ 2

То, что вам не хватает, это класс NSURLProtocol. Выполняет около трех десятков строк кода, и любой код, который правильно обрабатывает URL-адреса, может получить доступ к вашим данным в памяти. Прочтите документацию, это не сложно, и есть пример кода.

К сожалению, есть некоторые API, которые принимают NSURL как параметр, но могут обрабатывать только URL-адреса файлов.