NSKeyedUnarchiver - 删除解码数据?

17

我之前的问题没有得到任何回复,所以我想知道是否稍微改一下问题描述会有所帮助。

我正在使用NSKeyedArchiver编码一些复杂的对象并将其保存到磁盘上,就像这样 -

Class member {
    int *id;
    NSString *name;
    NSMutableArray *array;
    TempClass *object;
}
我想实现的功能是使用户能够保存他的工作,比如在创建一个新成员时,以便稍后回来使用。当用户完成操作后,他点击提交按钮,数据将被传输到Web服务。否则,他只需点击保存并离开屏幕,数据将被保留,以便应用程序可以从用户离开时的那个点继续恢复。现在,一旦我将数据发布到Web服务,我就不想再将数据保留在磁盘上了,但我确实无法找到删除数据的方法。
现在,我的编码和解码类运行良好。我可以使用NSKeyedArchiver将数据保存到磁盘中,并使用NSKeyedUnarchiver检索它。但是,我的问题是,如何删除我不再需要的数据?我必须手动删除磁盘上的文件吗?是否有任何方法可以让NSKeyedUnarchiver删除它正在返回的数据?
谢谢, Teja.
5个回答

23

一种简单的方法是在发布数据后以编程方式删除它:

- (BOOL) deleteFile:(NSString *) pathOfFileToDelete error:(NSError *)err {
    BOOL exists = [[NSFileManager defaultManager] fileExistsAtPath: pathOfFileToDelete];
    if(exists) { 
        [[NSFileManager defaultManager]removeItemAtPath: pathOfFileToDelete error:err];
    }
    return exists;
}

1
谢谢。但是,我如何获取文件的名称?如果我归档多个对象,它们会保存为多个文件吗? - Tejaswi Yerukalapudi
1
好的,我意识到那是一个愚蠢的问题。我不会重写我的保存代码来为我创建的每个存档写入不同的文件。我可以在需要时删除它们。 - Tejaswi Yerukalapudi

8

一个 Swift3 示例:

do {
 try FileManager.default.removeItem(atPath: path)
} catch {
 // catch potential error
}

5

对于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
    }
}

2

对于Swift 2.0:

do {
  try NSFileManager.defaultManager().removeItemAtPath("Your_PATH")
} catch {

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接