Swift NSFileManager.defaultManager().removeItemAtPath仅在应用程序终止时删除文件
因此,我使用下面的方法来处理获取、删除和保存我的应用程序的图像。当我调用Swift NSFileManager.defaultManager().removeItemAtPath仅在应用程序终止时删除文件,swift,nsfilemanager,Swift,Nsfilemanager,因此,我使用下面的方法来处理获取、删除和保存我的应用程序的图像。当我调用removeImage时,它会成功,当我使用NSFileManager.defaultManager().fileExistsAtPath时,它会说该文件不存在。但是,当我调用getImage时,即使图像已被删除,它仍然可以抓取图像。当我重新启动应用程序时,getImage会按预期工作,直到我使用removeImage。我还尝试过将removeImage调用包装成dispatch\u async(dispatch\u get
removeImage
时,它会成功,当我使用NSFileManager.defaultManager().fileExistsAtPath
时,它会说该文件不存在。但是,当我调用getImage
时,即使图像已被删除,它仍然可以抓取图像。当我重新启动应用程序时,getImage
会按预期工作,直到我使用removeImage
。我还尝试过将removeImage
调用包装成dispatch\u async(dispatch\u get\u main\u queue(),{})
,但它仍然不起作用
我的代码:
class func removeImage(user:User){
let context = getManagedObjectContext()
context.performBlockAndWait({
guard let paths = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true) as [String]! where paths.count > 0 else{
return
}
do{
if let dirPath = paths[0] as String!{
let path = "\(user.id)_\(user.name).png"
let readPath = (dirPath as NSString).stringByAppendingPathComponent(path)
try NSFileManager.defaultManager().removeItemAtPath(readPath)
}
}catch{
}
})
}
class func saveImage(user:User,image:UIImage){
let path = "\(user.id)_\(user.name).png"
guard let paths = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true) as [String]! where paths.count > 0 else{
return
}
if let dirPath = paths[0] as String!{
let writePath = (dirPath as NSString).stringByAppendingPathComponent(path)
UIImagePNGRepresentation(image)!.writeToFile(writePath, atomically: true)
}
}
class func getImage(user:User)->UIImage?{
let path = "\(user.id)_\(user.name).png"
guard let paths = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true) as [String]! where paths.count > 0 else{
return nil
}
if let dirPath = paths[0] as String!{
let readPath = (dirPath as NSString).stringByAppendingPathComponent(path)
return UIImage(named: readPath)
}
return nil
}
更新/修复!将代码更改为此,并成功:
class func removeImage(user:User){
let manager = NSFileManager.defaultManager()
do{
let directoryURL = try manager.URLForDirectory(.DocumentationDirectory, inDomain: .UserDomainMask, appropriateForURL: nil, create: true)
if #available(iOS 9.0, *) {
let url = NSURL(fileURLWithPath: "\(user.id)_\(user.name).png", relativeToURL: directoryURL)
try manager.removeItemAtURL(url)
} else {
let url = directoryURL.URLByAppendingPathComponent("\(user.id)_\(user.name).png")
try manager.removeItemAtURL(url)
}
}catch{
}
}
class func saveImage(user:User,image:UIImage){
let manager = NSFileManager.defaultManager()
do{
let directoryURL = try manager.URLForDirectory(.DocumentationDirectory, inDomain: .UserDomainMask, appropriateForURL: nil, create: true)
if #available(iOS 9.0, *) {
let url = NSURL(fileURLWithPath: "\(user.id)_\(user.name).png", relativeToURL: directoryURL)
UIImagePNGRepresentation(image)!.writeToURL(url, atomically: true)
} else {
let url = directoryURL.URLByAppendingPathComponent("\(user.id)_\(user.name).png")
UIImagePNGRepresentation(image)!.writeToURL(url, atomically: true)
}
}catch{
}
}
class func getImage(user:User)->UIImage?{
let manager = NSFileManager.defaultManager()
do{
let directoryURL = try manager.URLForDirectory(.DocumentationDirectory, inDomain: .UserDomainMask, appropriateForURL: nil, create: true)
if #available(iOS 9.0, *) {
let url = NSURL(fileURLWithPath: "\(user.id)_\(user.name).png", relativeToURL: directoryURL)
if let data = NSData(contentsOfURL: url){
return UIImage(data: data)
}
} else {
let url = directoryURL.URLByAppendingPathComponent("\(user.id)_\(user.name).png")
if let data = NSData(contentsOfURL: url){
return UIImage(data: data)
}
}
}catch{
}
return nil
}
我将使用NSURL重新开始,而不是强制转换为NSString以使用路径。好的,我将检查它。仍然是NSURL的相同问题,实际上解决了它!不确定为什么使用NSURL会起作用,而路径不会起作用…我将使用NSURL重新开始,而不是强制转换为NSString来使用路径。好的,我会检查它。仍然与NSURL相同的问题实际上解决了它!不知道为什么使用NSURL会起作用,但是路径不会。。。