【问题标题】:Cancel AWSS3 TransferUtility Upload task on button tap点击按钮取消 AWSS3 TransferUtility 上传任务
【发布时间】:2018-03-01 22:29:29
【问题描述】:

我的要求是在用户希望时取消上传。 我正在关注 TransferUtility 文档来设置和上传视频、显示进度、即使应用程序处于后台也能保留状态。我找不到任何方法来取消uploadTask。

{
let uploadRequest = AWSS3TransferManagerUploadRequest()
let  transferUtility = AWSS3TransferUtility.default()
var completionHandler : AWSS3TransferUtilityUploadCompletionHandlerBlock?
var uploadTask : AWSTask<AWSS3TransferUtilityUploadTask>?
let expression = AWSS3TransferUtilityUploadExpression()

}


func startUpload() {

uploadTask = transferUtility.uploadFile((uploadRequest?.body)!,
                                   bucket: (uploadRequest?.bucket)!,
                                   key: (uploadRequest?.key)!,
                                   contentType: "video/mov",
                                   expression: expression,
                                   completionHander: completionHandler).continue({ (task) -> AnyObject! in if let error = task.error {
                                    print("Error: \(error.localizedDescription)")
                                    }
                                    if let _ = task.result {

                                    }
                                    return nil;
                                   }) as? AWSTask<AWSS3TransferUtilityUploadTask>


}

我想知道我应该在任务上使用哪个 continue 块,以及如何像我们用于 TransferManager 任务的方式一样执行诸如 uploadTask.cancel() 之类的操作。

【问题讨论】:

    标签: ios swift amazon-s3 aws-sdk awss3transferutility


    【解决方案1】:

    从 AWS documentation,您应该使用 AWSS3TransferManagerUploadRequest 作为取消上传请求的点。

    这么简单:

    uploadRequest.cancel()
    

    如果您想取消AWSS3TransferUtility 任务。您应该直接与他们合作。

    使用方法enumerateToAssignBlocks 获取所有活动的AWSS3TransferUtility 任务。或者直接使用getUploadTasks()方法。

    AWSS3TransferUtility.default().getUploadTasks()
    

    获得所有活动上传任务后,只需使用每个任务的taskIdentifier 即可找到它是什么任务。是的,您应该存储 taskIdentifier 之前想要取消的任务。

    取消方法示例。

    static func cancel(taskIdentifier: UInt) {
            _transferUtility.enumerateToAssignBlocks(forUploadTask: { (uploadTask:AWSS3TransferUtilityUploadTask, progress:AutoreleasingUnsafeMutablePointer<(@convention(block) (AWSS3TransferUtilityTask, Progress) -> Void)?>?, error: AutoreleasingUnsafeMutablePointer<(@convention(block) (AWSS3TransferUtilityUploadTask, Error?) -> Void)?>?) in
                if uploadTask.taskIdentifier == taskIdentifier {
                    uploadTask.cancel()
                }
            }, downloadTask: nil)
     }
    

    【讨论】:

    • 感谢您的回复。我试图获取所有活动的任务,但我无法运行循环并取消所有任务。我想知道取消 AWSTask 的代码行。
    • 你应该单独取消每个任务
    • 既然我将任务实例保存为“uploadTask”,我可以像uploadTask.result.cancel()一样取消吗?但这并没有发生。
    • @OlegGordiichuk 我对 AWSS3TransferUtilityUploadTask 有同样的问题。我无法取消上传任务,所以请您帮帮我。谢谢。
    • @OlegGordiichuk 你能告诉我如果我有多个分段文件同时上传,我怎样才能让 taskIdentifier 取消特定文件上传?
    【解决方案2】:

    当我想取消一个特定的上传请求或所有上传请求时,我使用这两种辅助方法:

    static func cancelAllUploads() {
        AWSS3TransferUtility.default().enumerateToAssignBlocks(forUploadTask: { (uploadTask, progress, error) in
            uploadTask.cancel()
        }, downloadTask: nil)
    }
    
    static func cancelAllUploads(withTaskId taskId: UInt) {
        AWSS3TransferUtility.default().enumerateToAssignBlocks(forUploadTask: { (uploadTask, progress, error) in
            if uploadTask.taskIdentifier == taskId {
                uploadTask.cancel()
            }
        }, downloadTask: nil)
    }
    

    【讨论】:

    • 开始uploadtask时如何获取taskId?
    • @chiragshah:调用异步任务let uploadTask = AWSS3TransferUtility.default().uploadFile(...后,可以通过调用uploadTask.result?.taskIdentifier获取taskId
    猜你喜欢
    • 2020-01-10
    • 1970-01-01
    • 1970-01-01
    • 2019-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多