A maneira mais fácil de escrever NSData para um arquivo
Pergunta
NSData *data;
data = [self fillInSomeStrangeBytes];
A minha pergunta agora é como eu posso escrever este data
sobre a maneira mais fácil para um arquivo.
(Eu tenho já um file://localhost/Users/Coding/Library/Application%20Support/App/file.strangebytes
NSURL)
Solução
NSData
tem um método chamado writeToURL:atomically:
que faz exatamente o que você quer fazer. Procurar em a documentação para NSData
para ver como usá-lo.
Outras dicas
Observe que escrever NSData
em um arquivo é uma operação IO que podem bloquear o thread principal. Especialmente se o objeto de dados é grande.
Por isso, é recomendável executar isso em uma discussão de fundo, a maneira mais fácil seria usar GCD da seguinte forma:
// 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: atomicamente: ou WriteToFile: atomicamente:. se você tiver um nome de arquivo em vez de um URL
Você também tem writeToFile:options:error:
ou writeToURL:options:error:
que pode denunciar códigos de erro no caso da conservação da NSData
falhou por qualquer motivo. Por exemplo:
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;
}