代码之家  ›  专栏  ›  技术社区  ›  Tejaswi Yerukalapudi

nskeyedunarchiver-删除解码数据?

  •  15
  • Tejaswi Yerukalapudi  · 技术社区  · 14 年前

    我以前的(相关的)问题没有得到任何回复,所以我想稍微解释一下是否有帮助。

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

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

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

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

    谢谢,
    Teja。

    5 回复  |  直到 6 年前
        1
  •  20
  •   Kerem Baydoğan David Zorychta    9 年前

    一种非常简单的方法,只需在发布数据后以编程方式将其删除:

    - (BOOL) deleteFile:(NSString *) pathOfFileToDelete error:(NSError *)err {
        BOOL exists = [[NSFileManager defaultManager] fileExistsAtPath: pathOfFileToDelete];
        if(exists) { 
            [[NSFileManager defaultManager]removeItemAtPath: pathOfFileToDelete error:err];
        }
        return exists;
    }
    
        2
  •  5
  •   Jegadees Waran    8 年前

    斯威夫特2:

    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
    }
    
        3
  •  5
  •   mrc5    7 年前

    swift3示例:

    do {
     try FileManager.default.removeItem(atPath: path)
    } catch {
     // catch potential error
    }
    
        4
  •  2
  •   Phil    9 年前

    斯威夫特2:

    do {
      try NSFileManager.defaultManager().removeItemAtPath("Your_PATH")
    } catch {
    
    }
    
        5
  •  2
  •   MhmdRizk    6 年前

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