1layout: post
title: "July 19, 2021, TIL (Today I Learned) King fisher and more"
summary: "analyzing Kingfisher"
author: inwoodev
date: '2021-07-19 22:35:23 +0530'
category: ['Swift_iOS', 'TIL']
thumbnail: /assets/img/posts/light-bulbs.jpg
keywords: ios, swift, kingfisher
permalink: /blog/TIL(Today I Learned)/70
usemathjax: true
자주 열람하는 데이터를 빨리 쓸 수 있게 임시적으로 저장 해 놓는 공간
Kingfisher의 이미지 캐싱 방식의 종류는 무엇무엇이 있나요?
Kingfisher의 캐싱 기본동작은 어디어디에 캐싱하는 건가요?
public enum CacheType {
/// The image is not cached yet when retrieving it.
case none
/// The image is cached in memory.
case memory
/// The image is cached in disk.
case disk
/// Whether the cache type represents the image is already cached or not.
public var cached: Bool {
switch self {
case .memory, .disk: return true
case .none: return false
}
}
}
디스크 캐시의 기본 경로는?
~/Library/Caches
/// DiskStorage.swift
/// 567 line
extension DiskStorage {
struct Creation {
let directoryURL: URL
let cacheName: String
init(_ config: Config) {
let url: URL
if let directory = config.directory {
url = directory
} else {
url = config.fileManager.urls(for: .cachesDirectory, in: .userDomainMask)[0]
}
cacheName = "com.onevcat.Kingfisher.ImageCache.\\(config.name)"
directoryURL = config.cachePathBlock(url, cacheName)
}
}
}
디스크 캐시에 읽고 쓰는 기본 데이터 타입은?
public let diskStorage: DiskStorage.Backend<Data>
디스크 캐시 기능 수행을 위해 실질적으로 디스크에 쓰고 읽을 때 사용하는 Foundation 프레임워크 클래스는?
extension DiskStorage {
struct Creation {
let directoryURL: URL
let cacheName: String
init(_ config: Config) {
let url: URL
if let directory = config.directory {
url = directory
} else {
url = config.fileManager.urls(for: .cachesDirectory, in: .userDomainMask)[0]
}
cacheName = "com.onevcat.Kingfisher.ImageCache.\\(config.name)"
directoryURL = config.cachePathBlock(url, cacheName)
}
}
}
/// DiskStorage.swift
/// 468 line
extension DiskStorage {
/// Represents the config used in a `DiskStorage`.
public struct Config {
/// Creates a config value based on given parameters.
///
/// - Parameters:
/// - name: The name of cache. It is used as a part of storage folder. It is used to identify the disk
/// storage. Two storages with the same `name` would share the same folder in disk, and it should
/// be prevented.
/// - sizeLimit: The size limit in bytes for all existing files in the disk storage.
/// - fileManager: The `FileManager` used to manipulate files on disk. Default is `FileManager.default`.
/// - directory: The URL where the disk storage should live. The storage will use this as the root folder,
/// and append a path which is constructed by input `name`. Default is `nil`, indicates that
/// the cache directory under user domain mask will be used.
public init(
name: String,
sizeLimit: UInt,
fileManager: FileManager = .default,
directory: URL? = nil)
{
self.name = name
self.fileManager = fileManager
self.directory = directory
self.sizeLimit = sizeLimit
}
}
}
Kingfisher에서는 기본적으로 이 값을 파일이름으로 사용하기도 합니다.
→ HashKey
// DiskStorage.swift
// 314 line
func cacheFileName(forKey key: String) -> String {
if config.usesHashedFileName {
let hashedKey = key.kf.md5
if let ext = config.pathExtension {
return "\\(hashedKey).\\(ext)"
} else if config.autoExtAfterHashedFileName,
let ext = key.kf.ext {
return "\\(hashedKey).\\(ext)"
}
return hashedKey
} else {
if let ext = config.pathExtension {
return "\\(key).\\(ext)"
}
return key
}
}
Hash는 어떤 개념인가요?
여기에 왜 Hash 처리한 값을 사용하는 걸까요?
어떤 이미지인지 분간이 가능해야 하는데 이를 위해서는 해당 이미지가 어디에 있던 이미지인지 알아야 됨. URL → hash함수 → key 값
딕셔너리에 URL에 해당되는 이미지를 value로 넣어준다는 개념. 이 url이 hashfunction을 거치면 local에서 쓸 수 있는 key 값으로 갖게될 수 있음