Skip to content

Releases: junil1030/CachingKit

Release 1.2.0

Choose a tag to compare

@junil1030 junil1030 released this 15 Jan 09:06

🎬 Video Caching Support

CachingKit 1.2.0부터 비디오 캐싱을 지원합니다.

New Features

Video Caching

  • loadVideo(url:progressHandler:) - 비디오 다운로드 및 디스크 캐싱
    • 진행률 콜백 지원 (0.0~1.0)
    • 중복 요청 방지
    • 캐시된 비디오는 로컬 URL 반환

Thumbnail Generation

  • getThumbnail(videoURL:targetSize:) - 비디오에서 썸네일 추출
    • AVAssetImageGenerator 기반
    • 추출된 썸네일은 이미지 캐시에 저장

SwiftUI Support

  • CachedAsyncVideo - 비디오 캐싱을 지원하는 SwiftUI 뷰
    • 썸네일 표시 → 탭하면 재생 전환
    • 다운로드 진행률 표시
    • 커스텀 content, thumbnail, placeholder 지원

Cache Management

  • clearVideoCache() - 비디오 캐시 삭제
  • 비디오 캐시도 LRU+LFU 하이브리드 eviction 정책 적용 (200MB 제한)

Usage

// 비디오 로드
let localURL = try await CachingKit.shared.loadVideo(
    url: videoURL,
    progressHandler: { print("\\(Int($0 * 100))%") }
)

// SwiftUI
CachedAsyncVideo(url: videoURL, targetSize: CGSize(width: 300, height: 200))

Release 1.1.0

Choose a tag to compare

@junil1030 junil1030 released this 22 Dec 06:07

🎉 New Features

SwiftUI Support

  • CachedAsyncImage 컴포넌트 추가
    • SwiftUI에서 네이티브하게 사용할 수 있는 비동기 이미지 로딩 뷰
    • 커스텀 content 및 placeholder 지원
    • UIKit의 모든 캐싱 전략(memory, disk, both)과 호환
    • Task 기반의 자동 취소 및 메모리 관리
CachedAsyncImage(
    url: imageURL,
    targetSize: CGSize(width: 300, height: 300)
) { image in
    image
        .resizable()
        .aspectRatio(contentMode: .fill)
} placeholder: {
      ProgressView()
}

Custom Headers

  • 기본 헤더 설정 지원
    • CacheConfiguration에 defaultHeaders 프로퍼티 추가
    • 모든 네트워크 요청에 적용되는 공통 헤더 설정 가능
    • 인증이 필요한 이미지 엔드포인트 지원
var config = CacheConfiguration()
config.defaultHeaders = [
    "Authorization": "Bearer \(accessToken)"
]
  • 요청별 커스텀 헤더 지원
    • loadImage(), ck_setImage(), CachedAsyncImage 모두 headers 파라미터 추가
    • 요청별 헤더는 기본 헤더와 병합됨 (요청별 헤더가 우선순위)
    • 특정 요청에만 필요한 헤더를 동적으로 추가 가능
// UIKit
imageView.ck_setImage(
    with: url,
    targetSize: size,
    headers: ["X-Custom-Header": "value"]
)

// SwiftUI
CachedAsyncImage(
    url: url,
    targetSize: size,
    headers: ["X-Custom-Header": "value"]
)

Release Version 1.0.0

Choose a tag to compare

@junil1030 junil1030 released this 19 Dec 01:53

CachingKit v1.0.0

고성능 이미지 캐싱을 위한 Swift Package 라이브러리 첫 번째 릴리스입니다.

✨ 주요 기능

2단계 하이브리드 캐싱

  • 메모리 캐시: NSCache 기반 초고속 메모리 캐싱
  • 디스크 캐시: FileManager 기반 영구 저장
  • 메모리 부족 시 자동 캐시 정리

지능형 캐시 관리

  • LRU+LFU 하이브리드 제거 정책: 최근 사용(70%) + 사용 빈도(30%) 가중치 기반
  • ETag 기반 HTTP 재검증: 304 Not Modified로 불필요한 다운로드 방지
  • TTL(Time To Live): 만료 시간 기반 자동 캐시 무효화 (기본 7일)

메모리 최적화

  • 이미지 다운샘플링: CGImageSource를 이용한 효율적 리사이징
  • 메모리 워닝 감지 및 자동 정리
  • 물리 메모리의 25% 이내 자동 제한 (최대 150MB)

유연한 저장소 설정

// 기본 캐시 디렉토리
StoragePathProvider.default

// App Groups (위젯, 익스텐션과 공유)
StoragePathProvider.appGroups(identifier: "group.com.yourapp.shared")

// 커스텀 경로
StoragePathProvider.custom(url: customURL)

UIImageView Extension

imageView.ck_setImage(
    with: url,
    placeholder: placeholderImage,
    targetSize: CGSize(width: 300, height: 300),
    cacheStrategy: .both
)

📦 설치 방법

Swift Package Manager

Package.swift
dependencies: [
    .package(url: "https://github.com/yourusername/CachingKit.git", from: "1.0.0")
]

Xcode
1. File → Add Package Dependencies
2. Repository URL 입력
3. Version: 1.0.0 선택

🚀 빠른 시작

기본 사용

import CachingKit

// 기본 설정으로 사용
let image = await CachingKit.shared.loadImage(
    url: imageURL,
    targetSize: CGSize(width: 300, height: 300)
)

커스텀 설정

let config = CacheConfiguration(
    storageProvider: .appGroups(identifier: "group.com.yourapp.shared"),
    memoryLimit: 100 * 1024 * 1024,  // 100MB
    diskLimit: 200 * 1024 * 1024,     // 200MB
    ttl: 3 * 24 * 60 * 60              // 3일
)

let cachingKit = CachingKit(configuration: config)

let image = await cachingKit.loadImage(
    url: imageURL,
    targetSize: CGSize(width: 300, height: 300),
    cacheStrategy: .both  // .memoryOnly, .diskOnly, .both
)

UIImageView Extension

import CachingKit

imageView.ck_setImage(
    with: imageURL,
    placeholder: UIImage(named: "placeholder"),
    targetSize: imageView.bounds.size
)

// 이미지 로딩 취소
imageView.ck_cancelImageLoad()

캐시 통계

if let stats = await CachingKit.shared.getStatistics() {
    print("메모리 히트율: \(stats.memoryHitRate)")
    print("디스크 히트율: \(stats.diskHitRate)")
    print("ETag 히트율: \(stats.etagHitRate)")
    print("다운로드 횟수: \(stats.totalDownloads)")
    print("절약한 바이트: \(stats.totalBytesSaved)")
}

캐시 정리

// 메모리 캐시만 정리
CachingKit.shared.clearMemoryCache()

// 디스크 캐시만 정리
CachingKit.shared.clearDiskCache()

// 전체 캐시 정리
CachingKit.shared.clearAll()

🏗️ 아키텍처

Actor 기반 동시성

- 모든 캐시 작업은 Actor로 보호되어 스레드 안전 보장
- Swift Concurrency (async/await) 전면 지원

계층 구조

CachingKit (Public API)
    ↓
CacheManager (Actor)
    ↓
┌─────────────┬─────────────┐
MemoryCache   DiskCache    NetworkLoader
  (Actor)      (Actor)        (Actor)

📊 기술 사양

- 언어: Swift 5.9+
- 최소 버전: iOS 17.0 / macOS 14.0 / tvOS 17.0 / watchOS 10.0
- 동시성: Swift Concurrency (Actor 기반)
- 의존성: 없음 (Foundation, UIKit만 사용)

🎯 성능 특징

- 중복 요청 방지: 동일 URL 동시 요청 시 하나의 네트워크 호출만 실행
- 자동 리사이징: targetSize 기반 자동 다운샘플링으로 메모리 절약
- 점진적 로딩: 메모리 → 디스크 → 네트워크 순서로 폴백
- ETag 재검증: 304 응답으로 대역폭 절약

📝 전체 변경사항

Core

- ✨ CachingKit 메인 API 클래스
- ✨ CacheManager Actor (메모리/디스크 조율)
- ✨ CacheConfiguration (설정 관리)
- ✨ CacheMetadata (메타데이터 + 통계)
- ✨ CacheStrategy enum (캐싱 전략)
- ✨ CachingKitError (에러 타입)

Disk

- ✨ DiskCacheActor (디스크 캐시)
- ✨ DoublyLinkedList (LRU+LFU 알고리즘)
- ✨ StoragePathProvider (경로 추상화)

Memory

- ✨ MemoryCacheActor (메모리 캐시)

Network

- ✨ NetworkLoader (ETag 재검증)

Resize

- ✨ ImageResizer (다운샘플링)

Extensions

- ✨ UIImageView+CachingKit (편의 메서드)

Utils

- ✨ CacheStatistics (통계)
- ✨ String+Hash (SHA256)

🔗 링크

- 📖 https://github.com/yourusername/CachingKit/blob/main/README.md
- 📦 https://github.com/yourusername/CachingKit/blob/main/Package.swift
- 🐛 https://github.com/yourusername/CachingKit/issues

---
Full Changelog: https://github.com/yourusername/CachingKit/commits/v1.0.0