NSKeyedUnarchiver - 删除解码的数据?
Posted
技术标签:
【中文标题】NSKeyedUnarchiver - 删除解码的数据?【英文标题】:NSKeyedUnarchiver - delete decoded data? 【发布时间】:2011-03-20 06:28:27 【问题描述】:对于我之前的(相关)问题,我没有得到任何答复,所以我想知道稍微解释一下是否会有帮助。
我正在使用 NSKeyedArchiver 对一些复杂的对象进行编码并将其保存到磁盘。说,像 -
Class member
int *id;
NSString *name;
NSMutableArray *array;
TempClass *object;
我正在尝试构建的功能是让用户能够保存他的工作,比如说,同时创建一个新成员并稍后再回来。当用户完成后,他点击发布,数据将被传输到网络服务。如果没有,他只需单击保存并离开屏幕,数据就会被持久化,这样当用户回来时,应用程序就可以从那个点恢复。现在,一旦我将数据发布到网络服务,我不想再将数据保留在磁盘中,我真的找不到删除它的方法。
现在,我的编码和解码类运行良好。我可以使用 NSKeyedArchiver 将数据保存到磁盘并使用 NSKeyedUnarchiver 检索它。但是,我的问题是,如何删除不再需要的数据?我必须手动删除磁盘上的文件吗?有什么方法可以让 NSKeyedUnarchiver 删除它返回的数据?
谢谢, 泰迦。
【问题讨论】:
【参考方案1】:一种非常简单的方法,可以在您发布数据后以编程方式将其删除:
- (BOOL) deleteFile:(NSString *) pathOfFileToDelete error:(NSError *)err
BOOL exists = [[NSFileManager defaultManager] fileExistsAtPath: pathOfFileToDelete];
if(exists)
[[NSFileManager defaultManager]removeItemAtPath: pathOfFileToDelete error:err];
return exists;
【讨论】:
谢谢。但是,如何获取文件名?如果我归档多个对象,它们会保存为多个文件吗? 好吧,意识到这是一个愚蠢的问题。我不会重写我的保存代码来为我创建的每个存档写入不同的文件。然后我可以随时删除它们。【参考方案2】:Swift3 示例:
do
try FileManager.default.removeItem(atPath: path)
catch
// catch potential error
【讨论】:
【参考方案3】:对于 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
【讨论】:
【参考方案4】:对于 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
【讨论】:
【参考方案5】:对于 Swift 2.0:
do
try NSFileManager.defaultManager().removeItemAtPath("Your_PATH")
catch
【讨论】:
以上是关于NSKeyedUnarchiver - 删除解码的数据?的主要内容,如果未能解决你的问题,请参考以下文章
-[NSKeyedUnarchiver decodeObjectForKey:]:无法解码类的对象
NSKeyedUnarchiver decodeObjectForKey:无法解码类对象的键(NS.objects)