从URL下载大量图像需要很长时间

时间:2019-08-14 22:58:17

标签: swift firebase uiimage firebase-storage imagedownload

我有一个应用程序,允许用户在其图像上方放置动画。这些动画只是我循环浏览的一系列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
        }
    }

0 个答案:

没有答案