web-dev-qa-db-ja.com

NSDataをファイルに書き込む最も簡単な方法

NSData *data;
data = [self fillInSomeStrangeBytes];

私の質問は、ファイルへの最も簡単な方法でこのdataをどのように書くことができるかです。

(私はすでにNSURL file://localhost/Users/Coding/Library/Application%20Support/App/file.strangebytes

64
papr

NSDataには、あなたがやりたいことを正確に行うwriteToURL:atomically:というメソッドがあります。 NSDataのドキュメント を見て、使用方法を確認してください。

98
Alex

ファイルへのNSDataの書き込みは、メインスレッドをブロックする可能性のあるIO操作です。特にデータオブジェクトが大きい場合は注意してください。

したがって、バックグラウンドスレッドでこれを実行することをお勧めします。最も簡単な方法は、GCDを次のように使用することです。

// 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: または writeToFile:atomically: URLの代わりにファイル名がある場合。

30
Brian Campbell

writeToFile:options:error: または writeToURL:options:error: 何らかの理由でNSDataの保存に失敗した場合にエラーコードを報告できます。例えば:

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