[英]Storing Data on the disk in Swift / iOS
我正在嘗試實現離線緩存。 我創建了一個LocalFeedImageDataStore
,它應該將數據持久保存到磁盤,並允許在以后獲取它。
但是,如果我嘗試 append 到我的緩存位置的路徑,我會在插入和檢索時收到錯誤。
如果我使用:
FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
作為我的storeURL
它有效。
如果我使用: FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first..appendingPathComponent("feed/1b3c2a72-9720-44ac-b006-a1131793958e")
我可以出錯並且操作不保存。
public final class LocalFeedImageDataStore: FeedImageDataStore {
private let storeURL: URL
private let queue = DispatchQueue(label: "LocalFeedImageDataStore", qos: .userInitiated, attributes: .concurrent)
public init(storeURL: URL) {
self.storeURL = storeURL
}
public func insert(_ data: Data, for url: URL, then completion: @escaping (Result<Void, Error>) -> Void) {
let urlForData = makeCacheURL(storeURL, for: url)
queue.async(flags: .barrier) {
do {
try data.write(to: urlForData, options: .atomic)
completion(.success(()))
} catch {
print("INSERT ERROR", error)
completion(.failure(error))
}
}
}
public func retrieve(dataForURL url: URL, then completion: @escaping (Result<Data?, Error>) -> Void) {
let urlForData = makeCacheURL(storeURL, for: url)
print(urlForData)
queue.async {
do {
let data = try Data(contentsOf: urlForData)
completion(.success(data))
} catch {
print("FETCH ERROR", error)
completion(.failure(error))
}
}
}
}
private extension LocalFeedImageDataStore {
func makeCacheURL(_ baseURL: URL, for imageURL: URL) -> URL {
let encodedImageURL = Data(imageURL.path.utf8).base64EncodedString()
return baseURL.appendingPathComponent(encodedImageURL)
}
}
該文件夾不存在以添加文件
文件“1b3c2a72-9720-44ac-b006-a1131793958e”不存在
要解決此問題,請創建一個文件夾和您的圖像
public func insert(_ data: Data, for url: URL, then completion: @escaping (Result<Void, Error>) -> Void) {
let urlForData = makeCacheURL(storeURL, for: url)
queue.async(flags: .barrier) {
do {
try createFeedFolder()
let filePath = newPath.appendingPathComponent("1b3c2a72-9720-44ac-b006-a1131793958e", isDirectory: false)
try data.write(to: filePath, options: .atomic)
completion(.success(()))
} catch {
print("INSERT ERROR", error)
completion(.failure(error))
}
}
}
private func createFeedFolder() throws {
let filemanger = FileManager.default
if let path = filemanger.urls(for: .documentDirectory, in: .userDomainMask).first {
let newPath = path.appendingPathComponent("feed", isDirectory: true)
do {
if !filemanger.fileExists(atPath: newPath.absoluteString) {
try filemanger.createDirectory(at: newPath, withIntermediateDirectories: true, attributes: nil)
}
} catch { throw error }
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.