将上传状态传递回特定VC

时间:2016-09-15 12:46:26

标签: ios swift

我想从UploadtoServerVC获取VC1中的上传状态(%,成功,失败)(并且在上传开始之前将关闭UploadToServerVC)。下面是我的VC流程图。

ViewControllerFlow

在我的UploadToServerVC中,只要用户点击发送,我就会调用dismissViewControllerAnimated返回VC1并在UploadToServerVC内部(在场景后面,类似于Instagram)上传代码,继续运行直到完成(通过在完成块内保持强大的自我)。我想要实现的是在VC1中有一些进度条来显示进度或错误(如果遇到任何问题)。所以我想从VC1的上传代码(下面)中获取反馈。我的上传代码如下所示

@IBAction func postBtnPress(sender: AnyObject) {

    self.dismissViewControllerAnimated(true, completion: nil)

    // 2. Create upload request
    let uploadRequest = AWSS3TransferManagerUploadRequest()

    // Track progress through an AWSNetworkingUploadProgressBlock with strong self to allow block to be able to execute properly even if VC was dismissed
    uploadRequest?.uploadProgress = {(bytesSent:Int64, totalBytesSent:Int64, totalBytesExpectedToSend:Int64) in
        dispatch_sync(dispatch_get_main_queue(), { () -> Void in

            let progress = Float(totalBytesSent) / Float(totalBytesExpectedToSend)

            print(" totalBytesSent \(totalBytesSent) / totalBytesExpectedToSend \(totalBytesExpectedToSend) progress = \(progress * 100 ) %")
        })
    }

        // 3. Upload to Amazone S3
        let transferManager = AWSS3TransferManager.defaultS3TransferManager()
        transferManager.upload(uploadRequest).continueWithExecutor(AWSExecutor.mainThreadExecutor(), withBlock: { (task: AWSTask) -> AnyObject? in

            if let error = task.error {
                // Send error back to VC1

            } else {
                // Send completion status to VC1
            }
        }
    }
}

以下是我在第1,2,3节中展示风险投资的方式,如图所示

1. 
let vc1 = VC1()
let navController = UINavigationController.init(rootViewController: vc1)
self.navigationController?.presentViewController(navController, animated: true, completion: nil)

2.
self.navigationController!.pushViewController(uploadToServerVC, animated: true)

3.
self.dismissViewControllerAnimated(true, completion: nil)

我认为NSNotification可能是要走的路。但是,我不确定这是否是最佳做法,因为它可能会变得混乱?是否有更好的方法或通知是否可行?

3 个答案:

答案 0 :(得分:1)

我认为您在应用程序中需要 MVC结构时,已达到复杂程度。当视图控制器不再是屏幕层次结构的一部分时,保持视图控制器处于活动状态以进行数据处理不再是一个好的架构。

考虑创建非UI(模型)对象来管理数据传输。 VC1可以使用转移对象注册进度块,UploadToServerVC可以将其分配工作,而不必担心被解雇。

答案 1 :(得分:1)

我个人会创建一个上传器对象。然后将此方法放在对象中。在两个类都有访问权限的级别创建此对象(可能是导航控制器或全局)。

然后关闭视图控制器并在对象中设置属性,例如bool' shouldUpload' = true然后在视图控制器1出现之前开始上传(使用viewWillAppearMethod),只有它应该上传,否则它将在每次出现视图时执行。

最后在对象中配置upload方法也有一个完成块。然后,您可以在每次完成时收到进度更新,因为它将返回到v1或执行方法的位置。

答案 2 :(得分:0)

根据方法,如果您考虑应该选择类方法来返回上传文件的进度值。我的意思是创建类方法,其中写入代码以返回进度值,请参见下面的示例..

当dismisView方法调用时,来自uploadToServerVC:

  • 相应地使用true falseNSData设置密钥,如果需要上传图片,请使用NSData或以您的方式保存图片数据。
  • 现在导航回vc1。

现在在vc1中:

  • 检查密钥是否为true,使用AppDelegate或根据您的类方法传递数据并相应地接收上传进度。

类方法内部class func returnProgress() -> Int { // this is example code here to upload and return progress value return 10 }

// pass data in order to get progress value this is an example
AppDelegate.returnProgress()

从vc1调用类方法并上传文件数据:

Sheets("Sheet1").Range("K:K", "C:C").Copy Sheets("Sheet1").Range("BL1")
Sheets("Sheet1").Range("BL:BL", "BM:BM").RemoveDuplicates Columns:=Array(1, 2), Header:=xlNo