Как лучше всего найти каталог документов пользователя на iPhone?

Я читаю Поваренную книгу разработчика iPhone Эрики Садун и наткнулся на вопрос.

В книге она говорит, что найти каталог документов пользователя можно с помощью кода:

[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];

но это кажется немного хрупким и непохожим на обычный способ работы Mac, а именно:

NSSearchPathForDirectoriesInDomains(NSDocumentsDirectory, NSUserDomainMask, YES);

Есть ли какие-то особые причины использовать одно вместо другого?


person bwinton    schedule 07.11.2008    source источник
comment
опечатка: NSDocumentsDirectory == ›NSDocumentDirectory   -  person geowar    schedule 01.04.2014


Ответы (5)


Objc:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)

Быстрый:

var paths = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)

Вам понадобится первый элемент возвращенного массива.

person Ben Gottlieb    schedule 07.11.2008
comment
Круто, вот чем я воспользуюсь, но почему именно так, а не наоборот? - person bwinton; 07.11.2008
comment
Вы можете использовать другой способ, но если обновление ОС изменяет структуру по умолчанию, этот ответ гарантированно будет работать с новым макетом, в то время как первый способ либо завершится с ошибкой, либо начнет заново создавать устаревшие каталоги. - person Jason Coco; 07.11.2008

Вот код, который я использую в своей структуре.

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
person Lee    schedule 06.12.2008
comment
Начиная с Xcode 5, вы должны использовать [paths firstObject] вместо [paths objectAtIndex:0]. - person Cœur; 19.02.2014
comment
Или NSString * documentsDirectory = paths [0]; - person geowar; 01.04.2014
comment
Или paths.firstObject, поскольку это property. - person Iulian Onofrei; 15.12.2015

Вам следует рассмотреть возможность использования методов NSFileManager, которые возвращают URL-адреса, которые являются предпочтительным форматом.

let documentsURL = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)[0] as NSURL

Этот метод предназначен для поиска известных и общих каталогов в системе.

Массив объектов NSURL, идентифицирующих запрошенные каталоги. Каталоги упорядочены в соответствии с порядком констант маски домена: сначала элементы в пользовательском домене, а в конце - элементы в системном домене.

person Zelko    schedule 11.10.2012
comment
Это верно. Наши знания должны быть обновлены, что в iOS мы должны использовать NSURL, а не NSString (для пути) для представления локального файла. - person Juguang; 07.05.2013

Я использую это

NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSString *zipLocalPath = [documentPath stringByAppendingString:fileName];
person Nguyễn Văn Chung    schedule 17.01.2015

В swift v3 я использовал следующий фрагмент

var paths = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true)
person Suresh Velusamy    schedule 09.09.2017