July 19, 2021, TIL (Today I Learned) King fisher and more

Inwoo Hwang·2021년 8월 26일
0
post-thumbnail

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


학습내용


Kahoot

View LifeCycle

Screen Shot 2021-07-19 at 9.57.01 AM


LLDB

Screen Shot 2021-07-19 at 10.08.19 AM


NSCache

Screen Shot 2021-07-19 at 10.17.03 AM

Screen Shot 2021-07-19 at 10.21.23 AM

Local Caching

자주 열람하는 데이터를 빨리 쓸 수 있게 임시적으로 저장 해 놓는 공간

KingFisher

  • Kingfisher의 이미지 캐싱 방식의 종류는 무엇무엇이 있나요?

    • Kingfisher의 캐싱 기본동작은 어디어디에 캐싱하는 건가요?

      • Memory
      • Disk
      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)
              }
          }
      }
    • 디스크 캐시에 읽고 쓰는 기본 데이터 타입은?

      • Data
    public let diskStorage: DiskStorage.Backend<Data>
    • 디스크 캐시 기능 수행을 위해 실질적으로 디스크에 쓰고 읽을 때 사용하는 Foundation 프레임워크 클래스는?

      • FileManager
      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 function을 사용하여 hash value를 생성하고 이를 key로 사용해 key-value 형태로 저장
      • 기록한 아이템을 찾을 때도 hash function을 사용해 hash value값을 key로 통해 찾음
    • 여기에 왜 Hash 처리한 값을 사용하는 걸까요?

      • HashKey는 고유값, 중복이 되지 않기 때문에 딕셔너리의 Key로 사용 가능
      • caching한 파일이 많아져도 O(1) 시간복잡도로 파일 탐색이 가능함

    어떤 이미지인지 분간이 가능해야 하는데 이를 위해서는 해당 이미지가 어디에 있던 이미지인지 알아야 됨. URL → hash함수 → key 값

    딕셔너리에 URL에 해당되는 이미지를 value로 넣어준다는 개념. 이 url이 hashfunction을 거치면 local에서 쓸 수 있는 key 값으로 갖게될 수 있음

profile
james, the enthusiastic developer

0개의 댓글