メッセージチャンネルは、2 つのワーカー間で単方向のデータ受け渡しリンクを確立します。MessageChannel オブジェクトを使用したワーカー間でのデータ受け渡しには、1 つの重要なメリットがあります。メッセージチャンネルを使用してメッセージ(オブジェクト)を送信する場合、MessageChannel オブジェクトによって
channelMessage
イベントが送出されます。受信ワーカーのコードでそのイベントをリッスンして、データを取得できるタイミングを把握できます。そのようにした場合、受信ワーカーではデータの更新状況を継続的に確認する必要がありません。
メッセージチャンネルは、送信側と受信側の 2 つのワーカーのみに関連付けられます。MessageChannel オブジェクトを作成するには、送信 Worker オブジェクトの
createMessageChannel()
メソッドを、受信ワーカーを引数として渡して呼び出します。
// In the sending worker swf
var sendChannel:MessageChannel;
sendChannel = Worker.current.createMessageChannel(receivingWorker);
両方のワーカーから MessageChannel オブジェクトにアクセスできる必要があります。これを実行する最も単純な方法は、
setSharedProperty()
メソッドを使用して MessageChannel オブジェクトを渡すことです。
receivingWorker.setSharedProperty("incomingChannel", sendChannel);
受信ワーカーでは、MessageChannel オブジェクトの
channelMessage
イベントに対するリスナーを登録します。このイベントは、送信ワーカーがメッセージチャンネルを通してデータを送信するときに送出されます。
// In the receiving worker swf
var incomingChannel:MessageChannel;
incomingChannel = Worker.current.getSharedProperty("incomingChannel");
incomingChannel.addEventListener(Event.CHANNEL_MESSAGE, handleIncomingMessage);
実際にデータを送信するには、送信ワーカーで、MessageChannel オブジェクトの
send()
メソッドを呼び出します。
// In the sending worker swf
sendChannel.send("This is a message");
受信ワーカーでは、MessageChannel で
channelMessage
イベントハンドラーを呼び出します。次に、受信ワーカーで、MessageChannel オブジェクトの
receive()
メソッドを呼び出して、データを取得できます。
private function handleIncomingMessage(event:Event):void
{
var message:String = incomingChannel.receive() as String;
}
receive メソッドから返されたオブジェクトは、
send()
メソッドに渡したオブジェクトと同じデータタイプになります。受信するオブジェクトは、いくつかのデータタイプのオブジェクトを除き、送信側によって渡されたオブジェクトのコピーとなります。送信ワーカー内にあるオブジェクトに対する参照ではありません。詳しくは、
共有参照とコピーされた値
で説明します。