Domanda

Sto cercando di implementare un'applicazione P2P. Quello che cerco di fare è trasferire i dati una consuetudine della classe NSObject tra i dispositivi. Io non sono in grado di capire quando il metodo "receivedData" viene invocato da GKSession.

Ecco quello che ho fatto

  1. La connessione al solito e che mostra una finestra di dialogo con i coetanei

  2. Quando l'applicazione riceve un cambiamento di stato per un pari e lo stato è collegato, io mando i dati per tutti i peer (idealmente questo dovrebbe essere chiamato quando ogni peer accetta la connessione) con metodi NSCoding

  3. In receivedData, sto decodifica il NSData e tornare l'istanza NSObject

Il problema è il sessione: tra pari: didChangeState: metodo non è sempre chiamato su entrambi i dispositivi. E 'appena viene chiamato sul dispositivo che si tocca il pulsante "Connetti" nell'avviso PeerPicker.

Domande

  1. Quando si didChangeState chiamato e per chi? Non dovrebbe essere chiamato per ogni peer quando sono collegati?

  2. Quando è il receivedData: metodo di chiamata e per chi? E 'chiamato a confermare la ricezione di un messaggio (handshake) o semplicemente per trasmettere i dati inviati da altri peer?

Grazie per qualsiasi aiuto.

È stato utile?

Soluzione

Pensate più come 'master / slave' invece di 'peer to peer'. Presumibilmente entrambe le parti sono stati istituiti con GameKit e aveva loro delegati assegnati. L'unico lato che avvia la connessione viene avvisato tramite il valore di variazione dello stato GKPeerStateConnected che il ricevitore ha accettato l'invito e di una connessione è stata fatta in modo che possa iniziare a inviare roba sopra.

Il lato ricevente, invece, ottiene il suo primo avviso che qualcuno vuole parlare con essa attraverso il metodo didReceiveConnectionRequestFromPeer delegato. Si salva la sessione per un uso successivo poi si gira e chiede acceptConnectionFromPeer di accettarlo. Da allora in poi, si ottiene tutto ciò che è inviato attraverso attraverso il metodo receiveData.

Il modo migliore per farlo è quello di avere un po 'di stato-macchina che gestisce in quale stato ogni lato è in. Il mittente invia solo quando è ottenuto l'evento GKPeerStateConnected. Il ricevitore viene messo in stato di connected una volta che accetta una richiesta di connessione in modo che possa fare qualsiasi impostazione che deve fare prima di iniziare il recupero dei dati.

Dal momento che l'astrazione di rete è GKSession il ricevitore può poi girarsi e utilizzare la stessa istanza di sessione ha ottenuto in didReceiveConnectionRequestFromPeer e utilizzarlo per scrivere di nuovo al mittente (che dovrebbe avere il suo proprio metodo receiveData chiamato con le risposte dal ricevitore).

L'unica cosa da tenere a mente è che non c'è un limite di implicita dimensioni dei dati sul buffer è possibile inviare attraverso GameKit. Si consiglia di sperimentare per trovare ciò che è per il sistema (ho qualcosa tra 5K e 10K - per qualche motivo varia). Si consiglia di avere il codice di dividere il vostro NSData in blocchi e gestire pacchettizzazione / depacketizing i dati.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top