2016-09-15 48 views
1

我想从UploadtoServerVC中获取VC1中的上传状态(%,成功,失败)(UploadToServerVC将在上传开始前解除)。以下是我的VC流程图。将上传状态传递回特定的VC

ViewControllerFlow

在我UploadToServerVC,只要用户点击发送,我打电话dismissViewControllerAnimated回到VC1和具有内UploadToServerVC中的上传代码(现场,类似Instagram的后面)继续运行直到完成(通过保持强壮的自我在完成块内)。我想要实现的是在VC1中有某种进度条来显示遇到任何事情时的进度或错误。所以我想从VC1的上传代码(下面)中获取反馈。我上传的代码看起来像下面的是我如何在第1,2,3目前的风险投资,如下图所示在

@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. 
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

检查我答,如果服.. :) – vaibhav

回答

1

我认为你刚刚达到了你的应用程序中的一个MVC结构,其中你需要需要。当视图控制器不属于屏幕层次结构时,保持视图控制器处于活动状态以进行数据处理不再是一个好的架构。

考虑创建一个非UI(模型)对象来管理您的数据传输。 VC1可以向传输对象注册进度块,并且UploadToServerVC可以分配它的工作而不用担心存活被解雇。

+0

这听起来像是一个明智的办法。我对此很感兴趣,并且总是在没有太多MVC结构的情况下完成它(把大多数东西放在VC中)。我想知道如果你能给我提供一些示例代码或链接到一个很好的例子,我可以开始学习创建这样的“非UI对象(模型)”非常感谢 – user172902

1

就我个人而言,我会创建一个上传对象。然后将此方法放置在对象内。在两个类都可以访问的位置创建这个对象(可能是导航控制器或全局)。

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

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

+0

你能够提供一些示例代码作为我不熟悉创建上传对象的概念。传统上,我只是把大部分东西放在myVC中。或者一个很好的教程的链接也会很好:)非常感谢 – user172902

0

根据方法,如果你认为你应该选择类方法返回上传文件的进度值。我的意思是创造一个编写代码返回进度值见下面的例子类中的方法..

从uploadToServerVC时调用dismisView方法:

  • 使用NSUserDefaultstruefalse因此如果PIC需要上传或不设置键并使用NSData或以您的方式保存图片数据。
  • 现在回到vc1。
内VC1

现在:如果使用NSData真传的数据或根据您的加入方法,并相应地收到上传进度

  • 检查重点。

类方法中AppDelegate:从上传文件数据VC1

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() 
+0

我没有使用应用程序委托来做这样的事情。开始把这样的代码放在它里面是个好主意吗? – user172902

+0

在appdelegate或任何其他类中创建类方法是代码的“可重用性”,无需重复编写,因此如果您不想创建类方法,则可以将上传进度代码放入'vc1'中,并传递上传文件数据对它.. – vaibhav