sendbird-uikit-ios/Sources/Manager/CacheManager/SBUCacheManager.File.swift

134 lines
4.7 KiB
Swift

//
// SBUCacheManager.File.swift
// SendbirdUIKit
//
// Created by Tez Park on 2021/06/18.
// Copyright © 2021 Sendbird, Inc. All rights reserved.
//
import UIKit
import SendbirdChatSDK
// File cache path: {cachesDirectory}/file/{REQ_ID}/{FILENAME}.{EXT}
extension SBUCacheManager {
class File {
static let diskCache = DiskCache(cacheType: "file")
@discardableResult static func loadFile(
urlString: String,
cacheKey: String? = nil,
fileName: String? = nil,
completionHandler: SBUCacheCompletionHandler? = nil
) -> URLSessionTask? {
let fileName = self.createCacheFileName(
urlString: urlString,
cacheKey: cacheKey,
fileName: fileName
)
// Load cached file
if self.cacheExists(fileName: fileName) {
let filePath = URL(fileURLWithPath: diskCache.pathForKey(fileName))
let data = diskCache.get(key: fileName)
DispatchQueue.main.async {
completionHandler?(filePath, data)
}
return nil
}
// Load or Download file
guard let url = URL(string: urlString) else {
DispatchQueue.main.async {
completionHandler?(nil, nil)
}
return nil
}
let task = URLSession(configuration: .default).dataTask(with: url) { data, _, error in
guard let data = data, error == nil else {
DispatchQueue.main.async {
completionHandler?(nil, nil)
}
return
}
SBUCacheManager.File.save(data: data, fileName: fileName, completionHandler: completionHandler)
}
task.resume()
return task
}
static func save(data: Data?, fileName: String, completionHandler: SBUCacheCompletionHandler? = nil) {
return self.save(
nsdata: data as NSData?,
fileName: fileName,
completionHandler: completionHandler
)
}
static func save(nsdata: NSData?, fileName: String, completionHandler: SBUCacheCompletionHandler? = nil) {
guard let data = nsdata else {
DispatchQueue.main.async {
completionHandler?(nil, nil)
}
return
}
self.diskCache.set(key: fileName, data: data, completionHandler: completionHandler)
}
static func get(fileName: String) -> Data? {
let diskData = self.diskCache.get(key: fileName)
return diskData as Data?
}
static func preSave(fileMessage: FileMessage, fileName: String?, completionHandler: SBUCacheCompletionHandler? = nil) {
if let messageParams = fileMessage.messageParams as? FileMessageCreateParams {
let fileName = self.createCacheFileName(
urlString: fileMessage.url,
cacheKey: fileMessage.requestId,
fileName: fileName
)
self.save(
data: messageParams.file,
fileName: fileName,
completionHandler: completionHandler
)
}
}
static func createCacheFileName(urlString: String, cacheKey: String?, fileName: String?) -> String {
var filePath = SBUCacheManager.createHashName(urlString: urlString)
let pathExtension = SBUCacheManager.fileExtension(urlString: urlString)
if let cacheKey = cacheKey {
self.renameIfNeeded(key: filePath, newKey: cacheKey)
filePath = cacheKey
}
if let fileName = fileName {
return "\(filePath)/\(fileName)"
} else {
return "\(filePath)/File.\(pathExtension)"
}
}
static func renameIfNeeded(key: String, newKey: String) {
if self.cacheExists(fileName: key),
!self.cacheExists(fileName: newKey) {
self.diskCache.rename(key: key, newKey: newKey)
}
}
static func removeVoiceTemp(fileName: String?) {
self.diskCache.removeVoiceTemp(fileName: fileName)
}
static func cacheExists(fileName: String) -> Bool {
return self.diskCache.cacheExists(key: fileName)
}
}
}