Могу ли я создать NSURL, который ссылается на NSData в памяти?
Документы для NSURL
указывают, что:
Объект NSURL представляет собой URL-адрес, который потенциально может содержать расположение ресурса на удаленном сервере, путь локального файла на диск или даже произвольный фрагмент закодированных данных.
У меня есть blob данных в памяти, которые я хотел бы передать библиотеке, которая хочет загрузить ресурс с помощью NSURL
. Конечно, я могу сначала записать этот NSData
в временный файл, а затем создать из него file://
NSURL
, но я предпочел бы, чтобы URL-адрес указывал непосредственно на буфер, который я уже присутствовал в памяти.
Представленные выше документы, похоже, предполагают, что это возможно, но я не могу найти никакого намека на то, как это сделать. Я что-то пропустил?
Ответы
Ответ 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-адреса файлов.