N.May N.May - 22 days ago 9
Swift Question

IOS Multipeer Connectivity - Only sending part of my object

I've created an object with several properties to send: 1 string (sessiondate), an array of another object, 1 time interval and 1 Int (sessiondistance). I send this object using multipleer connectivity, and the devices register that they are receiving data. However, the integer isn't received. It becomes nil on receiving devices.

Thanks for any help!

This is the relevant code

func session(_ session: MCSession, peer peerID: MCPeerID, didChange state: MCSessionState) {
switch state {
case MCSessionState.connected:
print("Connected: (peerID.displayName)")

joinedSession = true
let hosting = ViewController().hostCheck()
print("InMCSessionConnected")
if(hosting == false){

}
if(hosting == true){


if(self.ConnectedUsers.text?.range(of: peerID.displayName) == nil){
DispatchQueue.main.async {
self.ConnectedUsers.text?.append(peerID.displayName + ", ")
}
}

HostingSession.noJoined = HostingSession.noJoined + 1;
print(HostingSession.noJoined)

print(SessionsManager.SessionInception.last?.SessionDistance)
print(SessionsManager.SessionInception.last?.SessionDate)
print("SendingData")
sendData(SessionsManager.SessionInception.last!)
print("SendingData")

}


case MCSessionState.connecting:
print("Connecting: \(peerID.displayName)")

case MCSessionState.notConnected:
print("Not Connected: \(peerID.displayName)")
joinedSession = false

}
}
func session(_ session: MCSession, didReceive data: Data, fromPeer peerID: MCPeerID) {
//This is called when data arrives
print("Starting Received Data")

let hosting = ViewController().hostCheck()
if(hosting == false){

let SessionSent = (NSKeyedUnarchiver.unarchiveObject(with: data) as! Sessions)
print(SessionSent.SessionDistance)

SessionsManager.SessionInception.append(SessionSent)//appends the session sent
//2 method gets the current date and line below appends this date to title
let currentSession = SessionsManager.SessionInception.last
let currentSessionDate = (currentSession?.SessionDate)!
print(currentSessionDate)
reloadView()

//Creates the table
TableView.rowHeight = 90
TableView.delegate = self
TableView.dataSource = self
TableView.reloadData()

print("Finished Received Data")
//ReadyButton.enabled = true
}
}

Answer

So in the end I got this working by sending each part of the object individually. See below:

func session(_ session: MCSession, peer peerID: MCPeerID, didChange state: MCSessionState) {
    switch state {
    case MCSessionState.connected:
        print("Connected: \(peerID.displayName)")

        joinedSession = true
        let hosting = ViewController().hostCheck()
        print("InMCSessionConnected")
        if(hosting == false){

        }
        if(hosting == true){


            if(self.ConnectedUsers.text?.range(of: peerID.displayName) == nil){
                DispatchQueue.main.async  {
                self.ConnectedUsers.text?.append(peerID.displayName + ", ")
                }
            }

            HostingSession.noJoined = HostingSession.noJoined + 1;
            print(HostingSession.noJoined)

            print(SessionsManager.SessionArray.last?.SessionDistance)
            print(SessionsManager.SessionArray.last?.SessionDate)
            print("SendingData")
            sendData(SessionsManager.SessionArray.last!)
            print("SendingData")
            //MARK: Work around
           sendDistance(SessionsManager.SessionArray.last!.SessionDistance!)
            sendStartTime((SessionsManager.SessionArray.last?.startTime)!)
        }


    case MCSessionState.connecting:
        print("Connecting: \(peerID.displayName)")

    case MCSessionState.notConnected:
        print("Not Connected: \(peerID.displayName)")
        joinedSession = false

    }
}
func session(_ session: MCSession, didReceive data: Data, fromPeer peerID: MCPeerID) {
    //This is called when data arrives
    print("Starting Received Data")
    let hosting = ViewController().hostCheck()
    if(hosting == false){

    if let SessionSent = (NSKeyedUnarchiver.unarchiveObject(with: data) as? Sessions)  {


    SessionsManager.SessionArray.append(SessionSent)//appends the session sent
    //2 method gets the current date and line below appends this date to title
    let currentSession = SessionsManager.SessionArray.last
    let currentSessionDate = (currentSession?.SessionDate)!
    print(currentSessionDate)
    reloadView()

    //Creates the table
    TableView.rowHeight = 90
    TableView.delegate = self
    TableView.dataSource = self
    TableView.reloadData()
        }//MARK: Work around
        else if let distanceSent = (NSKeyedUnarchiver.unarchiveObject(with: data) as? Int) {
        if (distanceSent < 100000){
        SessionsManager.SessionArray.last?.SessionDistance = distanceSent
        print(SessionsManager.SessionArray.last?.SessionDistance)


        }else{
        SessionsManager.SessionArray.last?.startTime = TimeInterval(distanceSent)
        print(SessionsManager.SessionArray.last?.startTime)
        }
        }
    print("Finished Received Data")
        //ReadyButton.enabled = true
    }
}

These are the sending subroutines:

//MARK: Work around
func sendDistance(_ TheData: Int){
    let dataToSend = NSKeyedArchiver.archivedData(withRootObject: TheData)

    if mcSession.connectedPeers.count > 0 {//makes sure it is actually sending it to any peers before it attempts
        do {
            try mcSession.send(dataToSend, toPeers: mcSession.connectedPeers, with: .reliable)//Ensures delivery using reliable method, sends dataToSend to all peers connected on mcSession.connectedPeers

        } catch let error as NSError {//Shows an error message if there is a problem
            print(error)
        }



    }

}

func sendStartTime(_ TheData: TimeInterval){
    let dataToSend = NSKeyedArchiver.archivedData(withRootObject: TheData)

    if mcSession.connectedPeers.count > 0 {//makes sure it is actually sending it to any peers before it attempts
        do {
            try mcSession.send(dataToSend, toPeers: mcSession.connectedPeers, with: .reliable)//Ensures delivery using reliable method, sends dataToSend to all peers connected on mcSession.connectedPeers

        } catch let error as NSError {//Shows an error message if there is a problem
            print(error)
        }



    }



    }

func sendData(_ TheData: NSObject){
    let dataToSend = NSKeyedArchiver.archivedData(withRootObject: TheData)
    if mcSession.connectedPeers.count > 0 {//makes sure it is actually sending it to any peers before it attempts
            do {
                try mcSession.send(dataToSend, toPeers: mcSession.connectedPeers, with: .reliable)//Ensures delivery using reliable method, sends dataToSend to all peers connected on mcSession.connectedPeers
            } catch let error as NSError {//Shows an error message if there is a problem
                print(error)
            }



    }