【问题标题】:NSKeyedUnarchiver - delete decoded data?NSKeyedUnarchiver - 删除解码的数据?
【发布时间】:2011-03-20 06:28:27
【问题描述】:

对于我之前的(相关)问题,我没有得到任何答复,所以我想知道稍微解释一下是否会有帮助。

我正在使用 NSKeyedArchiver 对一些复杂的对象进行编码并将其保存到磁盘。说,像 -

Class member {
    int *id;
    NSString *name;
    NSMutableArray *array;
    TempClass *object;
}

我正在尝试构建的功能是让用户能够保存他的工作,比如说,同时创建一个新成员并稍后再回来。当用户完成后,他点击发布,数据将被传输到网络服务。如果没有,他只需单击保存并离开屏幕,数据就会被持久化,这样当用户回来时,应用程序就可以从那个点恢复。现在,一旦我将数据发布到网络服务,我不想再将数据保留在磁盘中,我真的找不到删除它的方法。

现在,我的编码和解码类运行良好。我可以使用 NSKeyedArchiver 将数据保存到磁盘并使用 NSKeyedUnarchiver 检索它。但是,我的问题是,如何删除不再需要的数据?我必须手动删除磁盘上的文件吗?有什么方法可以让 NSKeyedUnarchiver 删除它返回的数据?

谢谢,
泰迦。

【问题讨论】:

    标签: iphone nskeyedarchiver


    【解决方案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 {
          
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2020-03-20
            • 2016-02-15
            • 1970-01-01
            • 2020-01-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多