2009-12-04 12 views
9

Czy funkcja NSSearchPathForDirectoriesInDomain jest nadal najlepszym sposobem uzyskania ścieżki do katalogu dokumentów iPhone'a? Pytam, ponieważ większość tematów, które widzę na ten temat, jest datowanych w zeszłym roku i nadal wydaje się dość kłopotliwym sposobem na uzyskanie dostępu do katalogu używanego zwykle na iPhone'ach. Można by pomyśleć, że nie byłoby to metoda wygoda dla tego teraz, podobnie jak NSBundle za bundlePath, executablePath itpUzyskiwanie katalogu dokumentów iPhone. Czy NSSearchPathForDirectoriesInDomains jest nadal jedynym sposobem?

Wystarczy być jasne, oznacza to wywołanie „NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask YES)”i wracając tablicę ze ścieżką dokumentami w indeksie 0.

Odpowiedz

2

działa to dla mnie dość krótkie i słodkie

#define kDOCSFOLDER [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"] 

Cheers!

+7

nie jest problem z tym, że nie jest gwarancją urządzenie uniwersalny jeśli Apple wprowadza zmiany ramowych w przyszłości? – iPhoneToucher

+0

podwójne złe. 1: twarde kodowanie nazwy oznacza, że ​​pęknie, gdy Apple ją zmieni. 2: jest to nadużycie preprocesora C. Zamiast tego użyj funkcji. Możesz nawet utworzyć funkcję inline, ale to cuchnie przedwczesnej optymalizacji –

22

Wzór wniosku Rdzeń danych oparte w Xcode udostępnia tę metodę:

- (NSString *)applicationDocumentsDirectory { 

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil; 
return basePath; 
} 

Więc wydaje się, że Apple nadal popiera coraz katalogu dokumentów w ten sposób. Można go przypisać do kategorii, ale uważam, że wystarczy włączyć tę metodę w małej garstce klas w danej aplikacji, która musi działać w katalogu dokumentów. Jeśli robisz dużo plików w różnych miejscach, możesz rozważyć refaktoryzację kodu, aby ograniczyć te zadania do jednej lub dwóch klas menedżerów.

Przynajmniej na trzecim lub czwartym razem powiedziałem: "Hej, dostaję katalog docs to ból w szyi" był moment, w którym zdałem sobie sprawę z niektórych możliwości, aby przesunąć plik żonglowania na dedykowaną klasę.

+0

+1 dziękuję bardzo, uratowałeś mi życie ponownie :) – swiftBoy

+2

Od Xcode 5, powinieneś użyć: 'NSString * basePath = [paths firstObject];' –

17

Obecny Rdzeń danych iOS szablonu w Xcode udostępnia tę metodę:

// Returns the URL to the application's Documents directory. 
- (NSURL *)applicationDocumentsDirectory 
{ 
    return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]; 
} 
+0

Od Xcode 5 powinieneś użyć 'firstObject' zamiast' lastObject' tutaj. –

+0

Cóż, nie sądzę, że to prawda. Właśnie próbowałem utworzyć nowy projekt "Pusta aplikacja" w Xcode 5.0.2. Sprawdziłem znacznik wyboru "Użyj danych podstawowych". W pliku AppDelegate.m widzę, że Xcode wygenerował tę samą metodę (używając lastObject) do pobierania katalogów dokumentów, które dostarczyłem w mojej odpowiedzi. Zatem używanie lastObject musi być prawidłowym sposobem. Jeśli myślisz inaczej, może możesz rozwinąć nieco więcej i udzielić pełnej odpowiedzi na to pytanie. –

+1

'-lastObject' jest łatwym obejściem z pre-Xcode 5 i jest kompatybilny z iOS2, podczas gdy firstObject jest kompatybilny tylko z iOS4. Prawda jest taka, że ​​potrzebujesz jakiegoś '-anyObject', ponieważ kolejność zwróconych obiektów jest nieudokumentowana. Logika sugeruje jednak, że najbardziej odpowiednim wynikiem był pierwszy dodany do tablicy, a zatem wiele osób używających '[0]'. Niestety, jeśli tablica jest pusta, wystąpi wyjątek, więc '-lastObject' był łatwiejszy (nie lepiej) przez jakiś czas, aż' -firstObject' został upubliczniony za pomocą Xcode 5. Apple prawdopodobnie nie zaktualizowało jeszcze wszystkich przykładów. –

Powiązane problemy