我有一个应用程序,允许用户在其图像上方放置动画。这些动画只是我循环浏览的一系列png文件。每个动画都有50至200帧循环播放。只需几个动画,此文件大小就会很快变得很大。
我目前解决此问题的尝试是将图像存储在Firebase存储中,然后在用户想要使用它们时下载它们。问题在于,下载动画图像会花费很长时间(如果我要下载数据并使用数据来创建图像,则需要10秒)。
我尝试使用FirebaseUI,只是下载了引用,然后使用sd_setImage显示图像,但是对于尝试快速循环浏览图像不起作用。
必须有一种更快的方法来执行此操作,而这不会导致我的应用程序过大。有什么建议吗?
下载图像
let startingPoint = Date()
var tupleArr = [(Int, UIImage)]()
for folder in MY_STORAGE.BDAY_FOLDER_ARRAY {
MY_STORAGE.BDAY_ANIM_FOLDER_REF.child(folder).listAll { (files, error) in
if let error = error {
print("BDAY ERR: \(error)")
} else {
for (index, fileRef) in files.items.enumerated() {
fileRef.getData(maxSize: 1 * 1024 * 1024, completion: { (data, error) in
if let error = error {
print("DATA ERR: \(error)")
} else {
let img = UIImage(data: data!)
tupleArr.append((Int(fileRef.fullPath.slice(from: "Comp_", to: ".png")!)!, img!))
if index == files.items.count - 1 {
let bdayOverlay = Overlay(type: Overlay.Types.bday, tupleArr: tupleArr)
self.overlays.append(bdayOverlay)
print("DONE")
print("\(startingPoint.timeIntervalSinceNow * -1) seconds elapsed")
}
}
})
}
}
}
循环浏览图像以将其显示为动画
var frameIndex = 0
var timer: Timer?
var bdayOverlay: Overlay?
func startAnimation(on imageView: UIImageView, forCount count: Int) {
// if there is a timer, invalidate it
timer?.invalidate()
frameIndex = 0
let deltaTime = 6.0 / Double(count)
timer = Timer.scheduledTimer(timeInterval: deltaTime, target: self, selector: #selector(updateFrame), userInfo: [
"imageView": imageView,
"count": count
], repeats: true)
}
func stopAnimation() {
timer?.invalidate()
timer = nil
}
@objc func updateFrame(_ timer: Timer) {
guard
let userInfo = timer.userInfo as? [String: Any],
let iv = userInfo["imageView"] as? UIImageView,
let count = userInfo["count"] as? Int
else { print("userInfo error"); return }
let sortedImages = TupleHelper.getSortedImageArray(from: bdayOverlay!.tupleArr)
iv.image = sortedImages[frameIndex]
frameIndex += 1
if frameIndex > count - 1 {
frameIndex = 0
}
}