我正在使用 NSKeyedArchiver 对一些复杂的对象进行编码并将其保存到磁盘。比如说 -
Class member {
int *id;
NSString *name;
NSMutableArray *array;
TempClass *object;
}
我试图构建的功能是让用户能够在创建新成员时保存他的工作,并稍后再返回。当用户完成后,他点击发布,数据将被传输到网络服务。如果没有,他只需单击“保存”并离开屏幕,数据就会被保留,以便当用户回来时应用程序可以从该点恢复。现在,一旦我将数据发布到网络服务,我就不想再将数据保留在磁盘中,而且我真的找不到删除它的方法。
现在,我的编码和解码类运行良好。我可以使用 NSKeyedArchiver 将数据保存到磁盘并使用 NSKeyedUnarchiver 检索数据。但是,我的问题是,如何删除不再需要的数据?我必须手动删除磁盘上的文件吗?有没有办法让 NSKeyedUnarchiver 删除它返回的数据?
发布数据后,有一种非常简单的方法可以通过编程方式将其删除:
- (BOOL) deleteFile:(NSString *) pathOfFileToDelete error:(NSError *)err {
BOOL exists = [[NSFileManager defaultManager] fileExistsAtPath: pathOfFileToDelete];
if(exists) {
[[NSFileManager defaultManager]removeItemAtPath: pathOfFileToDelete error:err];
}
return exists;
}
Swift3 示例:
do {
try FileManager.default.removeItem(atPath: path)
} catch {
// catch potential error
}
对于 Swift 2.0:
func deleteFile(path: String) -> Bool{
let exists = NSFileManager.defaultManager().fileExistsAtPath(path)
if exists {
do {
try NSFileManager.defaultManager().removeItemAtPath(path)
}catch let error as NSError {
print("error: \(error.localizedDescription)")
return false
}
}
return exists
}
对于 Swift 3.0 -> 4.1:
let fileManager = FileManager()
let fileName = "your_file_name"
//In Order to get your file path correctly
getFileURL(_ fileName: String) -> String? {
let fileURL = fileManager.urls(for: fileManager.SearchPathDirectory.documentDirectory, in: fileManager.SearchPathDomainMask.userDomainMask).first
return (fileURL?.appendingPathComponent(fileName).path)
}
//Persist Data
func persistData(_ data : Data) -> Bool{
return NSKeyedArchiver.archiveRootObject(data, toFile: getFileURL(fileName)!)
}
//Get Persisted Data
func getArchivedData() -> Data?{
return NSKeyedUnarchiver.unarchiveObject(withFile: getFileURL(fileName)!) as? Data
}
//Delete Persisted Data
func deleteArchivedUser() -> Bool{
do {
try fileManager.removeItem(atPath: getFileURL(fileName)!)
return true
} catch _ {
return false
}
}
对于 Swift 2.0:
do {
try NSFileManager.defaultManager().removeItemAtPath("Your_PATH")
} catch {
}