Путь NSURL против absoluteString - программирование
Подтвердить что ты не робот

Путь NSURL против absoluteString

Я видел много вопросов о SO относительно преобразования между NSURL и NSString. Все они включают использование NSString *path = [myURL absoluteString]; или NSString *path = [myURL path];. Какова фактическая разница между этими методами? Есть ли время, когда нужно использовать другое? Я пробовал обратиться к Apple Docs, но я нашел это менее полезным.

Я привык к тому, что URL упоминается только в дискуссиях относительно веб-сайтов и других тем, касающихся отправки информации между разными машинами, и никогда не упоминается при работе с файловой структурой на одной машине. Возможно, именно здесь происходит некоторая путаница, поскольку NSURL представляется предпочтительным способом доступа к файлам, независимо от того, существует ли этот файл в сети или на локальном устройстве. Или, может быть, это абсолютно несвязанная тема. Я даже не уверен.

4b9b3361

Ответ 1

Вопрос 1:

Какова фактическая разница между этими методами?

Проанализируйте эту запись 6 строк кода - 3 для локального и 3 для URL-адреса http - и немного поиграйте с ними.

Создайте NSURL с помощью схемы file://. Если вы спросите себя, почему существует 3 / после file:, вы должны помнить, что существует полный URL-адрес схемы (file://и абсолютный или относительный путь (вы можете найти дополнительную информацию о создании URL-адресов в RFC 1808 на стр. 3). Мы используем абсолютный путь, начинающийся с /, чтобы в итоге получилось ///.

NSURL *aLocalURL = [NSURL URLWithString:@"file:///Users/dennis/Desktop/"];
NSLog(@"absolute string: %@", aLocalURL.absoluteString);
NSLog(@"path: %@", aLocalURL.path);

Вывод:

абсолютная строка: файл:///Пользователи/dennis/Рабочий стол/
путь:/Пользователи/dennis/Рабочий стол

Итак, мы видим, что absoluteString все еще знает свою схему, тогда как path больше не имеет этой информации.

Примечание. path - это URL-адрес файла (каталога), а в качестве состояния docs - конечная косая черта.


Теперь давайте посмотрим на удаленные URL-адреса. С этими типами URL-адресов большинство людей более знакомы. Мы создаем его, используя ту же процедуру, что и для локальных URL-адресов. Наша схема теперь http://, а наш path равен www.apple.com/.

NSURL *anHTTPURL = [NSURL URLWithString:@"http://www.apple.com/"];  
NSLog(@"absolute string: %@", anHTTPURL.absoluteString);
NSLog(@"path: %@", anHTTPURL.path);

Вывод:

абсолютная строка: http://www.apple.com/
путь:/

Опять же, мы видим, что абсолютная строка все еще знает свою схему, но path теперь /. Таким образом, path представляется не подходящим способом при работе с удаленными URL-адресами.

Однако, когда мы имеем URL как http://www.apple.com/index.html, получим

Абсолютная строка: http://www.apple.com/index.html
путь:/index.html

Чтение документов также помогает:

В RFC 3986 ведущая косая черта после части полномочий (имя узла и порта) рассматривается как часть пути.

Итак, path - это все, что начинается (и включает) в косой черте после authority, которая www.apple.com в нашем случае.


Вопрос 2

Есть ли время, когда нужно использовать другое?

Из документов: (метод: path)

Если этот URL-адрес содержит URL-адрес файла (как определено с помощью isFileURL), возвращаемое значение этого метода подходит для ввода в методы NSFileManager или NSPathUtilities.

По моему мнению, в предложении четко указано, что вы должны использовать path при работе с NSFileManager или NSPathUtilities.


Вывод:

Когда вы работаете с удаленными URL-адресами, вы (обычно) используете absoluteString, иначе результат не тот, который вам (как правило) нужен.
Когда вы работаете с локальными URL-адресами, используйте path.

Источники:
http://www.ietf.org/rfc/rfc1808.txt
http://www.ietf.org/rfc/rfc3986.txt
Ссылка на класс NSURL