无法在多种连接框架中显示数据传输进度

时间:2018-03-21 16:30:31

标签: ios swift progress multipeer-connectivity

我正在尝试使用多种连接时打印数据传输的进度。 progress方法可以在didStartReceivingResourceWithName方法和发件人方面的接收方提供sendResource信息。 以下是我实现接收方的方法:

func session(_ session: MCSession, didStartReceivingResourceWithName resourceName: String, fromPeer peerID: MCPeerID, with progress: Progress) {
        DispatchQueue.main.async {
            print (progress)
        }
    }

以下是我实施发送方的方式:

func sendFileAction()->Progress{
        var filePath = Bundle.main.url(forResource: "10MO", withExtension: "file")
        if mcSession.connectedPeers.count > 0 {

            do {
                let data =  try Data(contentsOf: filePath!)
                fileTransferProgressInSender = mcSession.sendResource(at: filePath!, withName: "filename", toPeer: mcSession.connectedPeers[0]) { (error) -> Void in
                    DispatchQueue.main.async {
                        if error != nil {
                            print("Sending error: \(String(describing: error))")
                        }else{
                            print("sendAFile with no error "+"filename")
                        }
                    }
                }
            }
            catch let error as NSError {
                let ac = UIAlertController(title: "Send file error", message: error.localizedDescription, preferredStyle: .alert)
                ac.addAction(UIAlertAction(title: "OK", style: .default))
                present(ac, animated: true)
            }
        }
        return(fileTransferProgressInSender)
    }

接收器功能仅在开始时显示progress一次。

<NSProgress: 0x1c0133740> : Parent: 0x0 / Fraction completed: 0.0000 / Completed: 0 of 10485760  

我无法弄清楚我可以在哪里调用sendFileAction的回复来显示发送方的进度。

请帮忙吗? 感谢。

编辑: 我尝试使用以下代码:

func session(_ session: MCSession, didStartReceivingResourceWithName resourceName: String, fromPeer peerID: MCPeerID, with progress: Progress) {
        startTime = Date()

        DispatchQueue.main.async {
            self.endTransfer = false
            self.sendProgressBar.progress = 0.0
            self.updateProgress(progress: progress)
        }
    }

func updateProgress(progress:Progress){
        DispatchQueue.main.async {
            while !self.endTransfer {
                print (progress.fractionCompleted)
                self.sendProgressBar.progress = Float(progress.fractionCompleted)
            }
        }
    }

虽然print在控制台中取得了实际进展,但进度条从0跳到1(在print之前达到1)。

我做错了什么?

再次感谢。

2 个答案:

答案 0 :(得分:1)

对于您的接收器,您应捕获Progress变量以进行保存,然后通过重复计时器进行查询。

Apple概述了basics here

  

可用于取消传输的NSProgress对象   或查询确定转移进展的程度。

对于您的发件人,您将获得一个进度指示器作为函数的返回。保存并使用计时器查询以查找状态。

答案 1 :(得分:1)

感谢@CodeBender的提示。的确,我需要一个计时器。 所以这就是我的方式:

func session(_ session: MCSession, didStartReceivingResourceWithName resourceName: String, fromPeer peerID: MCPeerID, with progress: Progress) {
        startTime = Date()
        self.receptionProgress = progress
        DispatchQueue.main.async {
            self.receptionTimer = Timer.scheduledTimer(timeInterval: 0.1, target: self, selector: #selector(self.updateReceptionProgress), userInfo: nil, repeats: true)
            self.receptionTimer.fire()
        }
    }

以及相应的功能:

@objc func updateReceptionProgress(){
        self.receptionProgressBar.progress = Float(self.receptionProgress.fractionCompleted)
        if self.receptionProgress.completedUnitCount >= self.receptionProgress.totalUnitCount{
            self.receptionTimer.invalidate()
        }
    }