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)

Foi útil?

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;
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top