decent working method of storing data locally

This commit is contained in:
talksik
2022-01-03 19:05:50 -08:00
parent b77ae21973
commit 98c551bc33
@@ -73,7 +73,8 @@ class InnerCircleViewModel: NSObject, ObservableObject {
var audioRecorder : AVAudioRecorder! var audioRecorder : AVAudioRecorder!
var queuePlayer = AVQueuePlayer() var queuePlayer = AVQueuePlayer()
private var cachedPlayerItemsDict: [String: Data] = [:] // url to player item private var cachedPlayerItemsDict: [String: URL] = [:] // firebase audio url to local url
private let documentDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
@Published var isRecording : Bool = false @Published var isRecording : Bool = false
@@ -260,17 +261,18 @@ extension InnerCircleViewModel {
// reset progress // reset progress
self.messagesListeningProgress = Float(Self.multiplier * 2) self.messagesListeningProgress = Float(Self.multiplier * 2)
var AVPlayerItems: [CachingPlayerItem] = [] var AVPlayerItems: [AVPlayerItem] = []
for url in audioUrls { for url in audioUrls {
// if we have a player in the cache, then play it from there // if we have a player in the cache, then play it from there
if self.cachedPlayerItemsDict.keys.contains(url.absoluteString), let data = self.cachedPlayerItemsDict[url.absoluteString] { if self.cachedPlayerItemsDict.keys.contains(url.absoluteString), let localUrl = self.cachedPlayerItemsDict[url.absoluteString] {
// keep the cachedplayer item in tact as the player messes with those items // keep the cachedplayer item in tact as the player messes with those items
let cachedPlayerItem = CachingPlayerItem(data: data, mimeType: "audio/mp4", fileExtension: "m4a") let asset = AVAsset(url: localUrl)
AVPlayerItems.append(cachedPlayerItem) let playerItem = AVPlayerItem(asset: asset)
AVPlayerItems.append(playerItem)
print("playing a message from cache") print("playing a message from cache")
} else { } else {
let asset = AVAsset(url: url) let asset = AVAsset(url: url)
let playerItem = CachingPlayerItem(url: url) let playerItem = AVPlayerItem(asset: asset)
AVPlayerItems.append(playerItem) AVPlayerItems.append(playerItem)
} }
} }
@@ -393,7 +395,13 @@ extension InnerCircleViewModel {
let task = URLSession.shared.dataTask(with: audioUrl) {[weak self] (data, response, error) in let task = URLSession.shared.dataTask(with: audioUrl) {[weak self] (data, response, error) in
guard let data = data else { return } guard let data = data else { return }
print(data) print(data)
self?.cachedPlayerItemsDict[audioUrl.absoluteString] = data as? Data
if let cacheFilePath = self?.getTemporaryDirectory().appendingPathComponent("\(UUID().uuidString).m4a") {
try? data.write(to: cacheFilePath)
// save in local cache
self?.cachedPlayerItemsDict[audioUrl.absoluteString] = cacheFilePath
}
} }
task.resume() task.resume()