wake-up-neo.com

Der einfachste Weg, NSData in eine Datei zu schreiben

NSData *data;
data = [self fillInSomeStrangeBytes];

Meine Frage ist nun, wie ich dieses data am einfachsten in eine Datei schreiben kann.

(Ich habe bereits eine NSURL file://localhost/Users/Coding/Library/Application%20Support/App/file.strangebytes)

64
papr

NSData hat eine Methode namens writeToURL:atomically: das macht genau das was du willst. Schauen Sie in die Dokumentation für NSData nach, um zu sehen, wie man es benutzt.

98
Alex

Beachten Sie, dass das Schreiben von NSData in eine Datei eine IO) - Operation ist, die den Hauptthread blockieren kann, insbesondere wenn das Datenobjekt groß ist.

Aus diesem Grund wird empfohlen, dies auf einem Hintergrund-Thread durchzuführen. Der einfachste Weg wäre, 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];
});
33
Tom Susel

writeToURL: atomically: oder writeToFile: atomically: wenn Sie einen Dateinamen anstelle einer URL haben.

30
Brian Campbell

Sie haben auch writeToFile:options:error: oder writeToURL:options:error: kann Fehlercodes melden, falls das Speichern von NSData aus irgendeinem Grund fehlgeschlagen ist. Beispielsweise:

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;
}
1
Rob