我正在尝试使用多种连接时打印数据传输的进度。
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)。
我做错了什么?
再次感谢。
答案 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()
}
}