Overview 概要
Streaming media apps and long-running apps that send continual updates use an ongoing stream to upload data, rather than sending a single block of data or a flat file. You can configure an instance of URLSession
(a subclass of URLSession
) to work with a stream that you provide, and then fill this stream with data indefinitely.
ストリーミングメディアアプリと連続的なアップデートを送信する長く動作するアプリは、ある継続中のストリームを使ってデータをアップロードします、単一のブロックまたはフラットファイルを送信するのではなく。あなたは、URLSession
(URLSession
のサブクラス)のインスタンスを構成設定して、あなたが提供するストリームを扱います、そしてそれからこのストリームをデータで無期限に満たします。
The task gets the stream by calling your session’s delegate, so you need to create a session and set your own code as its delegate. タスクは、ストリームをあなたのセッションのもつ委任先を呼び出すことによって取得します、なのであなたはあるセッションを作成して、それの委任先としてあなた独自のコードを設定する必要があります。
Create a URL Session URLセッションを作成する
Begin by creating a URLSession and providing it with a delegate. Listing 1 creates a URL session with the default URLSession
and sets self
as the delegate. You’ll implement URLSession
later, in Provide the Stream to the Upload Task.
URLSessionを作成してそれにある委任先を提供することによって始めます。コード出力 1 は、あるURLセッションを省略時のURLSession
で作成して、self
を委任先として設定します。あなたは、URLSession
を後で実装します、ストリームをアップロードタスクに提供するにおいて。
Create a Streaming Upload Task ストリーミングアップロードタスクを作成する
Create the upload task with the URLSession
method upload
. This takes a URLRequest
specifying the URL you want to upload to, along with other parameters. You start the task by calling resume()
. Listing 2 shows how to create and start an upload task, connecting to a server on the local machine (127
) listening on port 12345
.
アップロードタスクをURLSession
のメソッドupload
で作成してください。これは、あなたがそれへとアップロードしたいURLを指定しているURLRequest
を、他のパラメータと一緒に取ります。あなたは、タスクをresume()
を呼び出すことによって始めます。コード出力 2 は、ローカルマシン(127
)上のサーバーに接続して、ポート12345
で聞き耳を立てている、あるアップロードタスクをどのように作成して開始するかを示します。
Use a Bound Pair of Streams to Provide an Input Stream ストリームの束縛対を使って入力ストリームを提供する
You provide the streaming data to the upload task as an Input
. The task reads data from this stream and uploads it to the destination.
あなたは、ストリーミングデータをアップロードタスクにInput
として提供します。タスクは、データをこのストリームから読み出してそれを行き先にアップロードします。
A good way to provide data to the input stream is to use a bound pair of streams. The bound pair contains an Output
that you write data to. Thanks to the binding of the streams, the data you write to the output stream is made available to the input stream, which the task can then read from. Figure 1 shows this arrangement.
データを入力ストリームに提供する1つの良い方法は、ストリームの束縛対を使うことです。束縛対は、あなたがデータをそれへと書き出すOutput
を含んでいます。ストリームそれらの束縛に感謝しましょう、あなたが出力ストリームへと書き出すデータは、入力ストリームに利用できるようにされます、それはタスクがその時それから読み出せます。図 1 は、この取り決めを示します。
Listing 3 shows a structure called Streams
that consists of an Input
and an Output
. The listing creates a property of this type, called bound
, by calling the get
method of the Stream
class, passing in in-out references for the input and output streams.
コード出力 3 は、Streams
と呼ばれる構造体を示します、それはInput
とOutput
から成ります。コード出力は、この型のbound
と呼ばれるあるプロパティを、Stream
クラスのget
メソッドを、入力および出力ストリームに対するin-out参照を渡して、呼び出すことによって作成します。
When you create the bound pair, make sure you specify a buffer size large enough to hold any data you write to the output stream, prior to the data being read from the input stream. Listing 3 uses a 4096-byte buffer. あなたが束縛対を作成する場合、入力ストリームから読み出されるデータに先だって、あなたが出力ストリームに書き出す何らかのデータを保持するのに十分に大きいバッファサイズを指定することを確実にしてください。コード出力 3 は、4096バイトのバッファを使います。
The listing also sets self
as the output stream’s delegate. Declare that your class implements the Stream
protocol in order to receive events that indicate when the output stream is ready to receive new data. You’ll provide the implementation of Stream
later, in Write Data to the Stream When It’s Ready.
コード出力はまた、self
を出力ストリームのもつ委任先として設定します。あなたのクラスがStream
プロトコルを、いつ出力ストリームが新しいデータを受け取る準備が出来るかを指し示すイベントを受け取る手段として実装することを宣言してください。あなたは、Stream
の実装を後で提供します、データをストリームにそれが準備できる時に書き出すにおいて。
Tip 助言
Your implementations of Stream
and URLSession
may be in the same class or in different classes, whichever makes more sense for your app’s architecture.
Stream
とURLSession
のあなたの実装は、同じクラスであるまたは異なるクラスであるかもしれません。
Provide the Stream to the Upload Task ストリームをアップロードタスクに提供する
You provide the input stream to the upload task in your implementation of the URLSession
method url
, which is called after you start the upload task by calling resume()
. The callback passes in a completion handler, which you call directly, passing in the bound
stream you created earlier. Listing 4 shows an implementation of this method.
あなたは、入力ストリームをアップロードタスクへと、URLSession
のメソッドurl
のあなたの実装において提供します、それは後であなたがアップロードタスクをresume()
を呼び出すことによって開始する後に呼び出されます。このコールバックは完了ハンドラに渡されます、それはあなたが直接に呼び出します、あなたが前に作成したbound
ストリームを渡して。コード出力 4 は、このメソッドの実装を示します。
Write Data to the Stream When It’s Ready データをストリームにそれが準備できる時に書き出す
Write data to an output stream only when the stream is ready for it. You get notified of the stream’s readiness in the Stream
method stream(_:
. When this callback sends has
as its event
parameter, the stream is ready to accept more data.
データを出力ストリームに、ストリームがそれに対して準備できている時に限り書き出してください。あなたは、ストリームの準備できていることをStream
のメソッドstream(_:
において通知されます。このコールバックがhas
をそれのevent
パラメータとして送る場合、ストリームはさらなるデータを受け入れる準備ができています。
If you’re not ready to write while handling the event, and would prefer to write on your own schedule, you can set a flag variable and check it later to determine whether it’s is safe to write to the stream. Listing 5 illustrates this technique. It handles the has
event by just setting a private can
property to true.
あなたが書き出す準備ができていない一方でそのイベントを処理している、そしてあなた独自の予定で書き出すのを望むならば、あなたはあるフラグ変数を設定してそれを後で確認することで、ストリームに書き出すことが安全であるかどうかを決定できます。コード出力 5 は、このテクニックを例示します。それは、has
イベントを、単にあるプライベートなcan
プロパティを true
に設定することによって処理します。
While handling stream events, also check whether event
is error
. This means that the stream has failed. When this happens, close the streams and abandon the upload.
ストリームイベントを処理する一方で、同様にevent
がerror
であるかどうか確認します。これは、ストリームが失敗したことを意味します。これが起こる場合、ストリームを閉じてアップロードを放棄してください。
Once you’re handling the has
event, you can write to the stream whenever you know it’s ready to receive more data. You write to the stream by calling its write(_:
method, providing a reference to the raw bytes to be written, and the maximum number of bytes to write.
一旦あなたがhas
イベントを処理するならば、あなたはストリームに書き出せます、それがさらにデータを受け取る準備ができているのをあなたが知る時はいつでも。あなたは、ストリームにそれのwrite(_:
メソッドを呼び出すことによって書き出します、書き出されることになる生のバイトへの参照、そして書き出される最大バイト数を提供して。
Listing 6 uses a timer to wait for the private can
property to become true. Once this is the case, the code creates a string representing the current date and converts it to raw bytes. The listing then calls write(_:
to send these bytes to the output stream. Because this output stream is bound to an input stream, the upload task can then automatically read these bytes from the input stream and send them to the destination URL.
コード出力 6 は、あるタイマーを使うことで、プライベートcan
プロパティがtrueになるのを待ちます。一旦そうなるならば、コードは現在の日付を表している文字列を作成して、それを生のバイトに変換します。コード出力は、それからwrite(_:
を呼び出すことで、それらバイトを出力ストリームに送ります。この出力ストリームがある入力ストリームに束縛されることから、アップロードタスクはそのとき自動的にそれらバイトを入力ストリームから読み出せます、そしてそれらを行き先URLに送ります。
Tip 助言
If the data you want to stream is coming from an asynchronous process, like callbacks from a media capture device, you still have to wait for the output stream to be ready before you write to it. In these situations, you can use a circular buffer to hold your data until the stream is ready to accept it. あなたがストリーミングしたいデータが非同期プロセスからやって来るならば、メディアキャプチャデバイスからのコールバックのように、あなたは依然として出力ストリームに対して待機することで、あなたがそれに書き出す前に準備できていなければなりません。これらの状況において、あなたはある循環バッファを使って、ストリームがそれを受け入れる準備ができるまであなたのデータを保持できます。
Once you write to the output stream, you can’t write again until your Stream
receives a new has
event. This example enforces this constraint by setting the class’ can
property to false
. It will be reset to true
when a new has
event is received by the output stream's delegate, as shown earlier in Listing 5.
一旦あなたが出力ストリームに書き出すならば、あなたは再び書き出すことはできません、あなたのStream
が新しいhas
イベントを受け取るまでは。この例は、この制約をそのクラスのもつcan
プロパティをfalse
に設定することによって強制します。それはtrue
に再設定されるでしょう、新しいhas
イベントが出力ストリームのもつ委任先によって受け取られる時に、前のコード出力 5で示されるように。