我想从UploadtoServerVC获取VC1中的上传状态(%,成功,失败)(并且在上传开始之前将关闭UploadToServerVC)。下面是我的VC流程图。
在我的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可能是要走的路。但是,我不确定这是否是最佳做法,因为它可能会变得混乱?是否有更好的方法或通知是否可行?
答案 0 :(得分:1)
我认为您在应用程序中需要 MVC结构时,已达到复杂程度。当视图控制器不再是屏幕层次结构的一部分时,保持视图控制器处于活动状态以进行数据处理不再是一个好的架构。
考虑创建非UI(模型)对象来管理数据传输。 VC1
可以使用转移对象注册进度块,UploadToServerVC
可以将其分配工作,而不必担心被解雇。
答案 1 :(得分:1)
我个人会创建一个上传器对象。然后将此方法放在对象中。在两个类都有访问权限的级别创建此对象(可能是导航控制器或全局)。
然后关闭视图控制器并在对象中设置属性,例如bool' shouldUpload' = true然后在视图控制器1出现之前开始上传(使用viewWillAppearMethod),只有它应该上传,否则它将在每次出现视图时执行。
最后在对象中配置upload方法也有一个完成块。然后,您可以在每次完成时收到进度更新,因为它将返回到v1或执行方法的位置。
答案 2 :(得分:0)
根据方法,如果您考虑应该选择类方法来返回上传文件的进度值。我的意思是创建类方法,其中写入代码以返回进度值,请参见下面的示例..
当dismisView方法调用时,来自uploadToServerVC:
true
false
或NSData
设置密钥,如果需要上传图片,请使用NSData
或以您的方式保存图片数据。 现在在vc1中:
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