2009-07-05 54 views
1

我想實現一個P2P應用程序。我試圖做的是在設備之間傳遞一個自定義NSObject類的數據。我無法弄清楚什麼時候GKSession調用了「receivedData」方法。iPhone - 如何在P2P傳輸數據

這裏是我做了什麼

  1. 通常的連接並顯示出同齡人一個對話框

  2. 當應用程序接收到一個狀態變化對等和國家相連,我在使用NSCoding方法發送數據給所有對等方(理想情況下應該在每個對等方接受連接時調用)

  3. 在receivedData中,我解碼NSData並獲取NSObject實例

的問題是會話:同行:didChangeState:方法是沒有得到所謂的兩個設備上。它只是在點擊PeerPicker警報中的「連接」按鈕的設備上被調用。

問題

  1. 當didChangeState打來電話,爲了誰?它們在連接時不應該爲每個對等點呼叫嗎?

  2. 何時調用receivedData:方法併爲誰提供?是否要求確認收到消息(握手)還是僅傳輸其他對等方發送的數據?

感謝您的任何幫助。

回答

4

認爲它更多的是'主/從'而不是'點對點'。據推測,雙方已經與GameKit建立了聯繫,並派出了他們的代表。啓動連接的一方會通過GKPeerStateConnected狀態更改值通知接收方已接受邀請並已建立連接,因此可以開始發送內容。

然而,接收方首先通知有人想通過didReceiveConnectionRequestFromPeer委託方法與其通話。它會保存會話供以後使用,然後轉向並呼叫acceptConnectionFromPeer接受它。從那以後,它通過receiveData方法獲得任何結果。

要做到這一點,最好的辦法是讓一個小型狀態機管理每一方所處的狀態。發件人只在收到GKPeerStateConnected事件時才發送。一旦接收到連接請求,接收器就會進入connected狀態,因此它可以在開始獲取數據之前完成它需要做的任何設置。

由於網絡抽象是GKSession接收方可以再回過頭來使用它didReceiveConnectionRequestFromPeer得到了相同的會話實例,並用它來寫回給發送者(誰應該有自己的receiveData方法調用響應從接收機) 。

需要記住的一件事是,您可以通過GameKit發送緩衝區上的數據大小限制。你可能想要試驗一下,找出你的系統是什麼(我得到5K和10K之間的東西 - 由於某些原因它有所不同)。你可能希望有代碼將你的NSData分成塊,並管理數據的打包/解包。

+0

非常感謝。這說明了事情.. – lostInTransit 2009-07-06 03:22:46