【问题标题】:What's the correct way to restart an NSOperation?重新启动 NSOperation 的正确方法是什么?
【发布时间】:2015-11-19 08:14:21
【问题描述】:

我正在尝试将文件上传到 AWS S3 存储桶。如果由于某种原因上传失败,我希望能够重试几次。

我有一个自定义的 NSOperation,它的主要方法创建了一个 AWSS3TransferManagerUploadRequest() 实例。在 AWSS3TransferManager 的帮助下,我开始上传。

如果失败,我应该在 task.completionBlock 中调用 main() 吗?或者我应该有我的 NSOperation 的完成块,并尝试从那里重新启动操作? 为了清楚起见,这里有一些代码

class PhotoUploadOperation: NSOperation {
var photoURL: NSURL!
var fileName: String!
var festival: PFObject!
var sleepTime: NSTimeInterval = 2.0
init(photoURL: NSURL, withFileName fileName:String, forFestival festival: PFObject) {
    super.init()
    self.photoURL = photoURL
    self.fileName = fileName
    self.festival = festival
}

override func main() {
    let uploadRequest = AWSS3TransferManagerUploadRequest()
    uploadRequest.bucket = "festivals123";
    uploadRequest.key = fileName
    uploadRequest.contentType = "image/jpeg"
    uploadRequest.body = photoURL
    uploadRequest.ACL = .PublicRead
    AWSS3TransferManager.registerS3TransferManagerWithConfiguration(DataManager.shared.awsConfiguration, forKey: "ID1")
    let transferManager = AWSS3TransferManager.S3TransferManagerForKey("ID1")

    let task = transferManager.upload(uploadRequest)
    task.continueWithBlock { (task: AWSTask!) -> AnyObject! in
        if (task.faulted) {
            print("now we need to restart upload for \(self.fileName)")
            NSThread.sleepForTimeInterval(self.sleepTime)
            if (self.sleepTime <= 2 ) {
                self.sleepTime = self.sleepTime*2
            }
            self.main()
        }

        return task
    }
}
}

【问题讨论】:

    标签: ios amazon-s3 nsoperation nsoperationqueue


    【解决方案1】:

    问了几位同事后,我猜的方法是,让操作以失败告终,然后创建另一个操作来执行相同的任务。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多