Хранение данных на диске в Swift / iOS - PullRequest
0 голосов
/ 06 апреля 2020

Я пытаюсь реализовать автономный кеш. Я создал LocalFeedImageDataStore, который должен сохранять данные на диск, а также разрешать их выборку в более позднее время.

Однако я получаю ошибку при вставке и ошибку при извлечении, если я пытаюсь добавить путь к моему кэш-памяти.

Если я использую:

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)
  }
}


1 Ответ

1 голос
/ 06 апреля 2020

Папка отсутствует для добавления файла

Файл «1b3c2a72-9720-44a c -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 }
    }
}
...