NSData *data;
data = [self fillInSomeStrangeBytes];
现在我的问题是如何data
以最简单的方式将此文件写入文件。
(我已经有一个NSURL file://localhost/Users/Coding/Library/Application%20Support/App/file.strangebytes
)
Answers:
请注意,写入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];
});
如果您使用文件名而不是URL,则writeToURL:atomically:或writeToFile:atomically:。
NSData
对象的来源是否与此方法有关? 在此问题中,我将保存NSData
从URL下载到对象中的.sqlite数据库,但似乎未正确保存它。该文件已写入,但是当我尝试访问它(通过我的应用程序或使用第三方查看器)时,它告诉我它不是有效的SQLite数据库。难道writeToURL:atomically:
只为减排工作NSString
秒或类似的东西?
您也可以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;
}
NSData
对象的来源是否与此方法有关? 在此问题中,我将保存NSData
从URL下载到对象中的.sqlite数据库,但似乎未正确保存它。该文件已写入,但是当我尝试访问它(通过我的应用程序或使用第三方查看器)时,它告诉我它不是有效的SQLite数据库。难道writeToURL:atomically:
只为减排工作NSString
秒或类似的东西?