[swift] Swift 앱에서 런치 이미지를 캐싱하여 로딩 속도 향상시키기

앱의 로딩 속도를 향상시키기 위해 Swift 앱에서 런치 이미지를 캐싱하는 방법을 알아보겠습니다.

1. 이미지 다운로드 및 캐싱 라이브러리 사용

Swift 앱에서 이미지를 다운로드하고 캐싱하기 위해서는 캐싱 라이브러리를 사용해야 합니다. 예를 들어, Kingfisher (https://github.com/onevcat/Kingfisher) 라이브러리는 매우 유용한 오픈 소스 라이브러리입니다. Kingfisher를 사용하여 이미지를 다운로드하고 캐싱하는 방법은 다음과 같습니다:

import Kingfisher

let url = URL(string: "https://example.com/launch_image.png")
let imageView = UIImageView()

imageView.kf.setImage(with: url, placeholder: UIImage(named: "placeholder_image"), options: [.transition(.fade(0.2))])

위의 코드에서 kf.setImage(with:placeholder:options:) 메서드를 사용하여 이미지를 다운로드하고 캐싱합니다. placeholder 매개변수에는 이미지가 로드되기 전에 표시할 임시 이미지를 지정할 수 있습니다. options 매개변수를 사용하여 이미지 로드 시 애니메이션 효과를 설정할 수도 있습니다.

2. 런치 이미지 캐싱하기

앱의 시작 시 로딩 화면으로 사용되는 런치 이미지를 캐싱하기 위해서는 UserDefaults를 사용할 수 있습니다. UserDefaults를 사용하면 앱이 처음 실행될 때 런치 이미지를 다운로드하고 캐싱한 후, 다음에 앱이 실행될 때 캐시된 이미지를 불러와서 로딩 화면으로 사용할 수 있습니다.

import UIKit

extension UserDefaults {
    enum Key: String {
        case launchImageURL
    }
    
    var launchImageURL: String? {
        get { return string(forKey: Key.launchImageURL.rawValue) }
        set { set(newValue, forKey: Key.launchImageURL.rawValue) }
    }
}

class LaunchViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        
        if let launchImageURL = UserDefaults.standard.launchImageURL, let url = URL(string: launchImageURL) {
            let imageView = UIImageView()
            imageView.kf.setImage(with: url)
            // 로딩 화면에 이미지 표시
        } else {
            // 이미지가 캐시되지 않았을 경우 로딩 화면을 위한 이미지 다운로드 및 캐싱 로직 실행
            downloadAndCacheLaunchImage()
        }
    }
    
    func downloadAndCacheLaunchImage() {
        let launchImageURLString = "https://example.com/launch_image.png"
        
        guard let url = URL(string: launchImageURLString) else {
            return
        }
        
        URLSession.shared.dataTask(with: url) { (data, response, error) in
            if let data = data, let image = UIImage(data: data) {
                let fileManager = FileManager.default
                let cacheDirectoryURL = fileManager.urls(for: .cachesDirectory, in: .userDomainMask).first
                let imagePath = cacheDirectoryURL?.appendingPathComponent("launch_image.png")
                
                fileManager.createFile(atPath: imagePath?.path ?? "", contents: data, attributes: nil)
                
                UserDefaults.standard.launchImageURL = imagePath?.absoluteString
                
                DispatchQueue.main.async {
                    // 로딩 화면에 이미지 표시
                    let imageView = UIImageView(image: image)
                    // ...
                }
            }
        }.resume()
    }
}

위의 코드에서 UserDefaults를 확장하여 launchImageURL 속성을 추가합니다. UserDefaults.standard.launchImageURL을 사용하여 캐시된 런치 이미지의 URL을 저장하고 로딩 화면에서 사용할 수 있습니다. 앱이 처음 실행될 때는 launchImageURL이 존재하지 않으므로 이미지를 다운로드하여 저장하고, 다음에 앱이 실행될 때는 캐시된 이미지를 사용합니다.

이제 앱이 실행될 때마다 처음 실행 시간에 캐싱한 런치 이미지를 로딩 화면으로 사용할 수 있게 되었습니다. 이를 통해 앱의 로딩 속도를 향상시킬 수 있습니다.