导致bug的原因是,直接保存文件路径filePath到UserDefault中,再取出后,直接用let imagedata = try? Data.init(contentsOf: filePath) 失败。
正确处理如下:
————————————————————————————————
//本地存储
let paths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)
var filePath: String?
var appendingPath: String?//加载图片的时候在用NSSearchPathForDirectoriesInDomains获取根目录,再appendingPathComponent上appendingPath,如果直接保存filePath,加载图片失败(路径相比较有前面多了file://,但是去掉也加载失败)
filePath = URL(fileURLWithPath: paths[0]).appendingPathComponent(appendingPath!).absoluteString
// 将图片文件数据写入沙盒中
var imageData:Data? = Data.init()
do {
try imageData = Data.init(contentsOf: URL(string: adInfo["url"]!)!)
}catch {
print("下载图片数据失败")
}
do {
try imageData?.write(to: URL(string: filePath!)!, options: Data.WritingOptions.atomic)
}catch {
print("写入缓存数据失败")
}
//banner页面显示
let paths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)
let appendingPath = MainTabBarController().getShowCommAdImage(type:"2")//必须重新获取重新拼接才能加载
let bannerImagePath = URL(fileURLWithPath: paths[0]).appendingPathComponent(appendingPath)
// print(bannerImagePath) //file:///var/mobile/Containers/Data/Application/4AE32403-817F-4813-AB19-3541628C436C/Documents/etouchSkyBannerImage2_10015,swift中的本地文件路径多了file://的前缀
let imagedata = try? Data.init(contentsOf: bannerImagePath)
if imagedata != nil {
bannerView.image = UIImage.init(data: imagedata! )
}
//Launch页面显示
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);
NSString *appendingPath = [tabbarVC getShowCommAdImageWithType:@"1"];
NSString *filePath = [[paths objectAtIndex:0] stringByAppendingPathComponent:[NSString stringWithFormat:@"%@", appendingPath]];///var/mobile/Containers/Data/Application/A8FB3F13-917E-4203-9CEE-7C399016C51B/Documents/etouchSkyLaunchImage7_10015
NSData *imagedata = [NSData dataWithContentsOfFile:_filePath];
if (imagedata) {
UIImage *image = [UIImage imageWithData:imagedata];
}