Der einfachste Weg, NSData in eine Datei zu schreiben
Frage
NSData *data;
data = [self fillInSomeStrangeBytes];
Meine Frage ist nun, wie ich auf eine Datei dieses data
auf einfachste Weise schreiben kann.
(Ich habe bereits ein NSURL file://localhost/Users/Coding/Library/Application%20Support/App/file.strangebytes
)
Lösung
NSData
hat eine Methode namens writeToURL:atomically:
, die nicht genau das, was Sie tun möchten. Schauen Sie in in der Dokumentation zu NSData
zu sehen, wie es zu benutzen.
Andere Tipps
Beachten Sie, dass NSData
in eine Datei schreiben, ist eine IO-Operation, die den Haupt-Thread blockieren kann. Vor allem, wenn das Datenobjekt groß ist.
Daher ist es ratsam, diese auf einem Hintergrund-Thread auszuführen, wäre der einfachste Weg, GCD wie folgt zu verwenden:
// Use GCD's background queue
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
// Generate the file path
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *dataPath = [documentsDirectory stringByAppendingPathComponent:@"yourfilename.dat"];
// Save it into file system
[data writeToFile:dataPath atomically:YES];
});
writeToURL: atomar: oder writeToFile: atomar. , wenn Sie einen Dateinamen anstelle einer URL
Sie haben auch writeToFile:options:error:
oder writeToURL:options:error:
die Fehlercodes für den Fall, das Speichern des Berichts kann NSData
fehlgeschlagen aus irgendeinem Grund. Zum Beispiel:
NSError *error;
NSURL *folder = [[NSFileManager defaultManager] URLForDirectory:NSApplicationSupportDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:true error:&error];
if (!folder) {
NSLog(@"%s: %@", __FUNCTION__, error); // handle error however you would like
return;
}
NSURL *fileURL = [folder URLByAppendingPathComponent:filename];
BOOL success = [data writeToURL:fileURL options:NSDataWritingAtomic error:&error];
if (!success) {
NSLog(@"%s: %@", __FUNCTION__, error); // handle error however you would like
return;
}