当移动到不同的视图控制器时,多对等连接不起作用。

问题描述 投票:0回答:1

我正在做一个应用,其中有两个使用MPC的视图控制器,一个是作为主机做广告,一个是选择其他用户连接。一旦连接用户准备继续,它就会告诉广告主和自己继续到另一个视图控制器。然而,虽然我使用的方法和前两个视图控制器中的方法类似,工作成功,但在这个新的视图控制器中,我无法成功发送或接收数据,我也没有收到任何错误信息。目标是让一个设备与其他连接的设备共享图像,所有这些设备都将在这个视图控制器上。以下是我目前所掌握的情况

import UIKit
import MultipeerConnectivity

class VotingViewController: UIViewController {

    @IBOutlet weak var imageView: UIImageView!

    var mcAdvertiserAssistant: MCAdvertiserAssistant!
    var peerID: MCPeerID = MCPeerID(displayName: UIDevice.current.name)
    var mcSession: MCSession!
    var stream: InputStream?

    override func viewDidLoad() {
        super.viewDidLoad()

        mcSession = MCSession(peer: peerID, securityIdentity: nil, encryptionPreference: .required)
        mcSession.delegate = self

    }

    @IBAction func share(_ sender: Any) {
          guard let imageToSend = UIImage(named: "Car.png") else { return }
          sendImage(img: imageToSend)
    }

    func sendImage(img: UIImage) {

       guard let mcSession = mcSession else { return }
     if mcSession.connectedPeers.count > 0 {
             if let imageData = img.pngData() {
                 //here's what to do
                 do {
                     try mcSession.send(imageData, toPeers: mcSession.connectedPeers, with: .reliable)
                 } catch let error as NSError {
                     let ac = UIAlertController(title: "Send error", message: error.localizedDescription, preferredStyle: .alert)
                     ac.addAction(UIAlertAction(title: "OK", style: .default))
                     present(ac, animated: true)
                 }
             }
         }
     }

}


// MARK: MCSessionDelegate
extension VotingViewController: MCSessionDelegate {
    func session(_ session: MCSession, peer peerID: MCPeerID, didChange state: MCSessionState) {
        switch state {
        case .connected:
        DispatchQueue.main.async{
          }

        case .connecting:
            DispatchQueue.main.async{
            }
            print("Connecting: \(peerID.displayName)")
        case .notConnected:
          DispatchQueue.main.async{
           }
            print("Not Connected: \(peerID.displayName)")
        @unknown default:
            print("Unknown state received: \(peerID.displayName)")
        }
    }

    func session(_ session: MCSession, didReceive data: Data, fromPeer peerID: MCPeerID) {
        DispatchQueue.main.async { [weak self] in
               if let image = UIImage(data: data) {
                self?.imageView.image = image
            }

        }
    }

    func session(_ session: MCSession, didReceive stream: InputStream, withName streamName: String, fromPeer peerID: MCPeerID) {

        print("Received stream")
        stream.delegate = self
        stream.schedule(in: RunLoop.main, forMode:RunLoop.Mode.common)
        stream.open()
    }

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

    func session(_ session: MCSession, didFinishReceivingResourceWithName resourceName: String, fromPeer peerID: MCPeerID, at localURL: URL?, withError error: Error?) {}
}

// MARK: MCAdvertiserAssistantDelegate
extension VotingViewController: MCAdvertiserAssistantDelegate {}

// MARK: StreamDelegate
extension VotingViewController: StreamDelegate {

    func stream(_ aStream: Stream, handle eventCode: Stream.Event) {
    }
}

我还在熟悉MPC,所以可能是个愚蠢的错误。先谢谢你了。

ios swift multipeer-connectivity
1个回答
0
投票

我认为--不要把你的MultipeerConnectivity的实现放在视图控制器中.没有保证这些视图控制器在一些导航后不会被释放。这不是最好的地方.而是在单独的类中实现这个,并作为服务使用。你可以从单人或appdelegate管理它。

© www.soinside.com 2019 - 2024. All rights reserved.