簡體   English   中英

在 Swift / iOS 的磁盤上存儲數據

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM