[swift] Swift SkeletonView 데이터 캐싱 방법

Swift SkeletonView는 데이터 로딩 중에 사용자에게 로딩 중임을 시각적으로 보여주는 데 사용되는 인기있는 라이브러리입니다. 그러나 데이터가 캐싱되어 있지 않은 경우, 매번 데이터를 로드할 때마다 SkeletonView를 표시해야 합니다. 이는 성능과 사용자 경험에 영향을 줄 수 있습니다. 이 문제를 해결하기 위해, SkeletonView의 데이터를 캐싱하는 방법을 알아보겠습니다.

메모리 캐싱

SkeletonView의 데이터를 메모리에 캐싱하는 가장 간단한 방법은 Singleton 객체를 사용하여 데이터를 저장하는 것입니다. Singleton 객체는 앱의 생애주기 동안 유일한 인스턴스를 가지게 되며, 데이터를 메모리에 보관합니다.

class DataManager {
    static let shared = DataManager()
    
    var cachedData: [String: Any] = [:]
    
    private init() {}
}

// 데이터 캐싱
DataManager.shared.cachedData["userData"] = userData

// 캐싱된 데이터 사용
if let userData = DataManager.shared.cachedData["userData"] {
    // SkeletonView 표시하지 않고 사용자 데이터를 표시
} else {
    // SkeletonView 표시
    // 데이터 로딩 후에 SkeletonView를 감추고 데이터를 표시
}

디스크 캐싱

데이터를 메모리에 캐싱하는 것 외에도, 디스크에 데이터를 캐싱하여 앱이 재시작 된 후에도 데이터를 유지할 수 있습니다. 디스크 캐싱을 위해서는 캐시 데이터를 파일이나 CoreData와 같은 로컬 데이터베이스에 저장해야 합니다.

class DataManager {
    static let shared = DataManager()
    
    var cacheDirectoryURL: URL {
        let paths = FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask)
        return paths[0]
    }
    
    private init() {}
    
    func saveDataToDisk(data: Any, key: String) {
        let fileURL = cacheDirectoryURL.appendingPathComponent(key)
        
        do {
            let archivedData = try NSKeyedArchiver.archivedData(withRootObject: data, requiringSecureCoding: false)
            try archivedData.write(to: fileURL)
        } catch {
            print("Failed to save data to disk: \(error.localizedDescription)")
        }
    }
    
    func loadDataFromDisk(key: String) -> Any? {
        let fileURL = cacheDirectoryURL.appendingPathComponent(key)
        
        do {
            let data = try Data(contentsOf: fileURL)
            let unarchivedData = try NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(data)
            return unarchivedData
        } catch {
            print("Failed to load data from disk: \(error.localizedDescription)")
            return nil
        }
    }
}

// 데이터 캐싱
DataManager.shared.saveDataToDisk(data: userData, key: "userData")

// 캐시된 데이터 사용
if let userData = DataManager.shared.loadDataFromDisk(key: "userData") {
    // SkeletonView 표시하지 않고 사용자 데이터를 표시
} else {
    // SkeletonView 표시
    // 데이터 로딩 후에 SkeletonView를 감추고 데이터를 표시
}

위의 코드는 데이터를 파일로 저장하는 방법을 보여주고 있으며, NSKeyedArchiver와 NSKeyedUnarchiver를 사용하여 데이터를 직렬화하고 역직렬화합니다. 필요에 따라 CoreData나 다른 로컬 데이터베이스를 사용할 수도 있습니다.

결론

Swift SkeletonView를 사용하여 데이터를 로딩하는 동안 사용자에게 로딩 중임을 시각적으로 보여줄 수 있습니다. 메모리와 디스크 캐싱을 통해 데이터를 캐싱하여 불필요한 SkeletonView 표시를 줄이고, 앱의 성능과 사용자 경험을 향상시킬 수 있습니다.