Dzisiaj postanowiłem jak napisać jak obsłużyć pliki pisząc aplikację na telefon iPhone. Zapisywanie plików może być przydatne w wielu sytuacjach np. jako cache, zapisanie stanu aplikacji lub wyniki w grach. Pokaże zapisywanie/odczytawanie plików w dokumentach oraz wczytywanie plików znajdujących się w projekcie.
Zapis plików
Na początku utworzyłem sobie metodę, w którą pobieram ścieżkę pliku
- (NSString *)getPathToFile
{
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
return [NSString stringWithFormat: @"%@/file.xml", documentsDirectory];
}
Nie zapomnij utworzyć deklaracji metody w pliku .h. Typ NSDocumentDirectory określa katalog w jakim chcemy zapisać plik i tak mamy do dyspozycji następujące typy:
-
NSApplicationDirectory– /Applications -
NSDemoApplicationDirectory -
NSDeveloperApplicationDirectory– /Developer/Applications -
NSAdminApplicationDirectory -
NSLibraryDirectory– /Library -
NSDeveloperDirectory– /Developer -
NSUserDirectory– /Users -
NSDocumentationDirectory -
NSDocumentDirectory -
NSCoreServiceDirectory - System/Library/CoreServices -
NSDesktopDirectory -
NSCachesDirectory– Library/Caches -
NSApplicationSupportDirectory– Library/Application Support -
NSDownloadsDirectory -
NSAllApplicationsDirectory -
NSAllLibrariesDirectory
Dokładne opisy w dokumentacji linki w liście. Teraz przejdźmy do zapisu pliku z wykorzystaniem powyższej metody:
- (BOOL)writeToFile
{
NSArray *data = [NSArray arrayWithObject:@"some object"];
return [data writeToFile:[self getPathToFile] atomically:YES];
}
metoda writeToFile:atomically zwraca wartość BOOL mówiąca czy się udało zapisać do pliku. Jeżeli atomically jest ustawione na tak dane są zapisywane do pliku pomocniczego, a następnie plik ten ma zmienianą nazwę na właściwą. Gwarantuje to zapis nawet jeśli coś stanie się z systemem.
Powyższy sposób jest najprostszym na zapisanie danych jeżeli chcemy zapisać tablicę (NSArray) lub słownik (NSDictionary). Jeżeli chcemy tak postąpić z obiektem NSDate. Musimy zamienić dane do formatu NSPropertyListBinaryFormat_v1_0:
- (BOOL)writeToFile
{
NSString *error;
NSData *pData = [NSPropertyListSerialization dataFromPropertyList:plist
format:NSPropertyListBinaryFormat_v1_0
errorDescription:&error];
if (!pData) {
NSLog(@"%@", error);
return NO;
}
return ([self writeApplicationData:pData toFile:[self getPathToFile]]);
}
Trzeba przyznać, że obsługa plików jest zrobiona dość zgrabnie w Objective-C. Nie martwimy się o otwieranie zamykanie pliku itp. sprawy. Pliki zapisywane są w postaci xmla opisującego strukturę danych, którą zapisujemy.
Odczyt plików
- (NSArray *)readFromFile
{
NSData *plistData;
NSString *error;
NSArray *data;
NSPropertyListFormat format = NSPropertyListXMLFormat_v1_0;
plistData = [NSData dataWithContentsOfFile:[self getPathToFile]];
data = [NSPropertyListSerialization propertyListFromData:plistData
mutabilityOption:NSPropertyListImmutable
format:&format errorDescription:&error];
if(!data)
{
/* działanie w przypadku nie wczytania pliku
* Ja zwracam akurat pustą tablicę
*/
[error release];
return [[NSArray alloc] init];
}
/* zwrócenie danych */
return dane;
}
Odczytywanie plików dostępnych w projekcie
Jedyne co musimy zmienić w odczytywanie pliku z katalogu projektu to metodę zwracającą nazwę pliku:
- (NSString *)getPathToFile
{
NSString *filePath = [[NSBundle mainBundle] resourcePath];
return [NSString stringWithFormat: @"%@/file.xml", filePath];
}
To wszystko jeśli chodzi o podstawy obsługi plików w Objective-C. Korzystajcie z plików w ułatwiania życia użytkownikom.
Jeżeli piszesz coś w Objective-C i nie możesz sobie z czymś poradzić napisz w komentarzu. Może ja albo moi koledzy się spotkaliśmy się już z tym i pomożemy Ci :)
Najnowsze komentarze