DevPrep

Все темы › Задачи с реальных собеседований

Кеш память + диск с дедупликацией: найди ошибки

Senior PRO

Задача

Код-ревью. Кеш должен: отдавать из памяти, затем с диска, затем качать; одинаковые URL не качать дважды одновременно. Найди ошибки.

actor ImageCache {
    private var memory: [String: UIImage] = [:]
    private var inFlight: [String: Task<UIImage, Error>] = [:]
    private let diskURL = FileManager.default.temporaryDirectory

    func image(for url: String) async throws -> UIImage {
        if let img = memory[url] { return img }

        let fileURL = diskURL.appendingPathComponent(url.hash.description)
        if let data = try? Data(contentsOf: fileURL), let img = UIImage(data: data) {
            memory[url] = img
            return img
        }

        if let existing = inFlight[url] { return try await existing.value }

        let task = Task<UIImage, Error> {
            let (data, _) = try await URLSession.shared.data(from: URL(string: url)!)
            let img = UIImage(data: data)!
            memory[url] = img
            try? data.write(to: fileURL)
            return img
        }
        inFlight[url] = task
        defer { inFlight[url] = nil }
        return try await task.value
    }
}

Продолжение ответа с кодом и уточняющими вопросами интервьюера — в приложении DevPrep.

Полный ответ — в DevPrep

Потренируйтесь перед собеседованием

В DevPrep эти ответы превращаются в задачи на минуту: что напечатает код, найди баг, пробное собеседование. По задаче в день.

Скачать DevPrep в App Store