我有几千张图片想从S3存储桶下载到iOS应用程序中。
但我的记忆有问题我无法追踪。
这是我的粗略代码:

let client = HttpClient<[SomeImage]>()

        client.get(fromURL: URL(string: endpoint)!) {
            (result, error) in

            if let error = error {
                self.log(message: "\(error)", level: .error)
                return
            }

            if let result = result {

                let downloadGroup = DispatchGroup()

                var count = 0

// just assembling a list of s3 keys to download here...
                for item in result {
                    for image in (item.images ?? []) {
                        let prefix = "\(image.key)/"
                        for key in ["\(globalGetThumbnailS3Key(byImageKey: image.key))",
                            "\(globalGetPreviewS3Key(byImageKey: image.key))"] {
                                count = count + 1

                                let completionHandler: AWSS3TransferUtilityDownloadCompletionHandlerBlock = {
                                    (task, URL, data, error) in

                                    if let error = error {
                                        self.log(message: "\(error)", level: .error)
                                        return
                                    }

                                    if let data = data, let localDir = FileManager.default.applicationSupportURL {
                                        do {
                                            let imageURL = localDir.appendingPathComponent(key)

                                            FileManager.default.directoryExistsOrCreate(localDir.appendingPathComponent(prefix))

                                            try data.write(to: imageURL)

                                            self.log(message: "downloaded \(prefix)\(key) to \(imageURL.absoluteString)", level: .verbose)
                                        } catch let error {
                                            self.log(message: "\(error)", level: .error)
                                            return
                                        }

                                    }
                                }

                                bgSyncQueue.async(group: downloadGroup) {
                                    self.transferUtility.downloadData(fromBucket: "\(globalDerivedImagesBucket)", key: key,
                                                                                expression: nil,
                                                                                completionHandler: completionHandler).continueWith {
                                                                                    (task) in

                                                                                    if let error = task.error {
                                                                                        // iirc, this error is caused, if the task couldnt be created due to being offline
                                                                                        self.log(message: "\(error)", level: .error)
                                                                                        return nil
                                                                                    }

                                                                                    if let result = task.result {
                                                                                        // do something with the task?
                                                                                        return nil

                                                                                    }

                                                                                    return nil
                                    }
                                }
                        }
                    }
                }

                self.log(message: "\(count) images to download...", level: .debug)
                bgSyncQueue.activate()
                downloadGroup.notify(queue: DispatchQueue.main) {
                    self.log(message: "All items downloaded?!")
                }
            }
        }
    }

所以我把所有对transfer实用程序的调用放在一个串行调度队列中,这个队列最初是不活动的。然后我激活队列,下载就可以开始了。但过了一会儿,应用程序崩溃,出现“来自调试器的消息:由于内存问题而终止”
不过,这款应用程序只消耗了大约1亿内存。我忽略了什么?

最佳答案

Rob建议使用“downloadToUrl”方法,这是一个不错的方法,我不需要使用GCD。再次感谢你,罗布!
transferUtility似乎是一个很好的工具,尽管文档记录非常糟糕。
以下是用于下载约20k张图像的简单代码:

for key in keys {
                    let imageURL = localDir.appendingPathComponent(key.1)


                    let completionHandler: AWSS3TransferUtilityDownloadCompletionHandlerBlock = {
                        (task, URL, data, error) in

                        if let error = error {
                            self.log(message: "failed downloading \(key.1): \(error)", level: .error)

                            DispatchQueue.main.async {
                                countingDown()
                            }

                            return
                        }

                        DispatchQueue.main.async {
                            countingDown()
                            if let onProgress = self.onProgress {
                                onProgress(100.0 - ((100.0 / Double(total)) * Double(count)))
                            }
                        }

                        //self.log(message: "downloaded \(key.1)")
                    }

                    transferUtility.download(to: imageURL, bucket: "\(globalDerivedImagesBucket)", key: key.1, expression: nil, completionHandler: completionHandler).continueWith {
                        (task) in

                        if let error = error {
                            self.log(message: "\(error)", level: .error)

                            DispatchQueue.main.async {
                                countingDown()
                            }

                            return nil
                        }

                        return nil
                    }
                }

关于ios - 如何使用传输实用程序从S3下载很多文件?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58610022/

10-16 14:10