ios - 尝试在后台使用 AWSS3TransferUtility 将多个文件上传到 AWS
问题描述
我在我的应用程序中有一个情况,我需要上传几个文件,范围从 10-50+-(小尺寸,约 5 mb),并且如果需要还需要支持在后台继续。此时,我可以在应用程序处于前台时完美上传,但一旦应用程序进入后台,当前正在运行的上传将继续运行并在后台完成,但由于某种原因,其余操作永远不会被调用。
这是我的代码
后台队列初始化:
private var _backgroundUploadQueue = OperationQueue()
后台队列设置:
self._backgroundUploadQueue.maxConcurrentOperationCount = 4
self._backgroundUploadQueue.name = "Background Queue"
self._backgroundUploadQueue.qualityOfService = .background
创建操作:
private func _createUploadOperation(from action: S3UploadAction) -> AsyncBlockOperation {
let operation = AsyncBlockOperation({ [weak self] operation in
guard !operation.isCancelled else {
operation.finish()
return
}
self?._s3SinglePartUploader.upload(
action: action,
completion: { [weak self] result in
self?._handleUploadCompletion(operation: operation, action: action, result: result)
}
)
self?._singlePartUploadStarted(action: action)
})
operation.name = "\(action.recordingSetVersion)_\(action.partNumber)"
return operation
}
添加操作:
private func _startBackgroundUploading() {
for (_, actions) in self._uploadActions.enumerated() {
for action in actions.value {
let uploadOperation = self._createUploadOperation(from: action)
self._backgroundUploadQueue.addOperation(uploadOperation)
}
}
}
在 AppDelegate 中,我添加了以下代码:
func application(
_ application: UIApplication,
handleEventsForBackgroundURLSession identifier: String,
completionHandler: @escaping () -> Void
) {
S3Uploader.shared.setBackgourndSessionCompletion(backgroundTaskCompletion: completionHandler)
AWSS3TransferUtility.interceptApplication(
application,
handleEventsForBackgroundURLSession: identifier,
completionHandler: completionHandler
)
}
解决方案
推荐阅读
- javascript - 未定义但可以在控制台(Webpack)中使用的函数
- amazon-web-services - AWS Serverless:未创建 SQS Lambda 触发器
- assembly - 如何在 8086 中编码 POP 指令?
- unity3d - 我的一项资产在统一时遇到问题
- php - PHPUnit 测试未执行
- laravel - 使用 Guzzle 发布表单数据总是返回 404
- java - 如何从对象流中统一对象的集合
- javascript - 无法在 fetch api 中使用变量
- python - 带有动画的图像上的 Python 绘图
- python - 从冻结集字典中检索值(python)