我開始爲一個p2p項目使用GameKit,並且我想在兩個客戶端同時調用一個函數。假設他們的時鐘沒有被設置爲完全相同的時間,那麼我怎樣才能調用NSTimer或者其他什麼,這樣我的函數在兩個客戶端同時被調用?如何在多個iPhone上同時調用某個功能?
謝謝!
我開始爲一個p2p項目使用GameKit,並且我想在兩個客戶端同時調用一個函數。假設他們的時鐘沒有被設置爲完全相同的時間,那麼我怎樣才能調用NSTimer或者其他什麼,這樣我的函數在兩個客戶端同時被調用?如何在多個iPhone上同時調用某個功能?
謝謝!
如果它只是通過藍牙連接的兩臺設備之間,那麼您可以分配一個作爲主時鐘,另一個作爲從設備。當第一次連接時,主站發送自己的當前時間。從機可以使用它來計算它自己的時鐘和服務器之間的增量。然後它將偏移任何定時器的三角洲並使用該值來設置一個定時器(主機使用自己的時鐘,客戶端自己的時鐘+/-差異w /主時鐘)。那樣的話,雙方都是相互同步的。
另一種方法是從服務器(或NIST,如果您需要絕對時間值)獲取時間,然後計算當前iPhone時間和服務器時間之間的增量。一旦你有了,你不會單獨依靠本地時間,但總是會抵消三角洲的影響。
這是相當準確的,但不允許網絡傳輸延遲。如果您需要精確到毫秒級,那麼您可能需要更加靈活並嘗試計算某種平均網絡延遲,以幫助縮小差距。
最好的方法是讓服務器查詢兩個客戶端以獲取他們的時鐘時間,然後計算時差,最後將定製時間發送給每個客戶端。
真的,更大的問題是:爲什麼你需要這樣做?坦率地說,這是一個巨大的痛苦,如果它是「所以雙方都看到同一件事情同時發生」,那麼只需讓一方成爲「服務器」並告訴其他方開始採取行動就可能更輕鬆一些會因網絡延遲而有所不同(可能爲數毫秒)。
你不能這樣做。通常情況下,您可以將客戶端連接到某種服務器,並保持心跳狀態並向客戶端發送消息,以便同步執行某些操作。如果你不能擁有一臺專用服務器,那麼與其中一臺P2P客戶端(通常是「主機」)會執行此功能並告訴其他人何時執行某種方法。 – 2009-07-01 00:41:38