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)

错误处理 - NSKeyedUnarchiver

NSKeyedUnarchiver.unarchiveObject() 取消归档旧对象

NSKeyedUnarchiver - 需要尝试/捕获?

NSKeyedUnarchiver - 如何防止崩溃