web-dev-qa-db-fra.com

La façon la plus simple d'écrire NSData dans un fichier

NSData *data;
data = [self fillInSomeStrangeBytes];

Ma question est maintenant de savoir comment écrire ce data de la manière la plus simple dans un fichier.

(J'ai déjà un NSURL file://localhost/Users/Coding/Library/Application%20Support/App/file.strangebytes)

64
papr

NSData possède une méthode appelée writeToURL:atomically: qui fait exactement ce que vous voulez faire. Regardez dans la documentation de NSData pour voir comment l'utiliser.

98
Alex

Notez que l'écriture de NSData dans un fichier est une opération IO qui peut bloquer le thread principal. Surtout si l'objet de données est volumineux.

Par conséquent, il est conseillé d'effectuer cette opération sur un thread d'arrière-plan, la façon la plus simple serait d'utiliser GCD comme suit:

// 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: ou writeToFile: atomically: si vous avez un nom de fichier au lieu d'une URL.

30
Brian Campbell

Vous avez aussi writeToFile:options:error: ou writeToURL:options:error: qui peut signaler des codes d'erreur au cas où la sauvegarde du NSData échouerait pour une raison quelconque. Par exemple:

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