2009-07-01 12 views
4

私はGameKitをp2pプロジェクトに使用し始めています。両方のクライアントで同時に関数を呼びたいと思います。彼らの時計が正確に同じ時刻に設定されていないと仮定して、どのようにNSTimerなどを呼び出すことができますので、私の関数は両方のクライアントで同時に呼び出されますか?同時に複数のiPhoneで関数を呼び出す方法はありますか?

ありがとうございます!

+3

あなたは本当にそれを行うことはできません。一般的に、クライアントは何らかの種類のサーバーに接続され、ハートビートを維持し、クライアントに同期して何かをするメッセージを送信します。専用のサーバを所有できない場合、P2Pクライアントの1つ(通常は「ホスト」)がこの機能を実行し、何らかの方法をいつ他の人に実行するかを伝えます。 –

+0

ありがとうございます。私は、ホストがクライアントに「いつ」を伝え、クライアントとサーバーで同時に実行させるかを理解しようとしています。だから、午後5時25分01頃に機能を実行し、もう1つは午後5時24分37秒に機能を実行するかもしれません。 – John

答えて

3

Bluetooth経由で接続されている2つのデバイスの間にあれば、1つをマスタークロックとして割り当て、もう1つをスレーブとして割り当てることができます。最初に接続すると、マスターは現在の時刻を送信します。スレーブはこれを使用して、独自のクロックとサーバー間の差分を計算できます。その後、デルタで任意のタイマをオフセットし、その値を使用してタイマを設定します(マスタは独自のクロックを使用します。クライアントは独自のクロック+/- diff /マスタクロックを使用します)。そうすれば、両側は互いに相対的に同期します。

別のオプションは、サーバー(または絶対時間値が必要な場合はNIST)から時間を取得し、現在のiPhone時間とサーバー時間の間の差分を計算することです。あなたがそれを持っていれば、現地時間だけに頼るのではなく、常にデルタでそれを相殺します。

これは合理的には正確ですが、ネットワークの伝送遅延を考慮していません。正確なミリ秒までダウンしなければならない場合は、ギャップを埋めるために、平均的なネットワーク遅延を計算することができます。

0

最良の方法は、両方のクライアントに時間を取得して時間差を計算して最終的に各クライアントにカスタム時間を送信するように照会するサーバーを持つことです。

0

本当に大きな問題は、なぜこれを行う必要があるかです。率直に言えば、それは巨大な痛みであり、「両当事者が同じことが同時に起きると思う」とすれば、一方の当事者を「サーバー」とし、他の当事者にその行動をネットワークの待ち時間(恐らく数ミリ秒)によって異なります。

関連する問題