func dataTaskPublisher (for: URLRequest) -> URLSession.DataTaskPublisher
func dataTaskPublisher (for: URL) -> URLSession.DataTaskPublisher
struct URLSession.DataTaskPublisher
Technology
Performing tasks with URL sessions is inherently asynchronous; it takes time to fetch data from network endpoints, file systems, and other URL-based sources. The URL Loading System accounts for this by delivering results asynchronously to delegates or completion handlers. The Combine framework also handles asynchronicity; using it to process your URL task results simplifies and empowers your code. URLセッションを伴うタスクの実行は、本質的に非同期です;それはデータをネットワークエンドポイント、ファイルシステム、および他のURL基盤ソースから取ってくるのに時間がかかります。URLローディングシステムは、これに責任を持ちます、結果を非同期に委任先または完了ハンドラに配達することによって。Combineフレームワークもまた非同期にうまく処理します;それを使ってあなたのURLタスク結果それらを平易に処理して、そしてあなたのコードの能力を高めてください。
URLSession
offers a Combine publisher, URLSession
, which publishes the results of fetching data from a URL
or URLRequest
. You create this publisher with the method data
. When the task completes, it publishes either:
URLSession
はCombineパブリッシャー、URLSession
を提供します、それはデータをURL
またはURLRequest
から取って来ることの結果を出版(パブリッシュ)します。あなたは、このパブリッシャーをメソッドdata
で作成します。タスクが完了する時、それが出版するのはこのどちらかです:
A tuple that contains the fetched data and a URLResponse
, if the task succeeds.
あるタプル、それは取って来たデータとURLResponse
を含みます、もしタスクが成功するならば。
An error, if the task fails. あるエラー、もしタスクが失敗するならば。
Unlike the completion handler passed to data
, the types received by your code aren’t optionals, since the publisher has already unwrapped the data or error.
data
に渡された完了ハンドラとは違い、あなたのコードによって受け取られる型はオプショナルではありません、パブリッシャーが既にアンラップされたデータまたはエラーを持つことから。
When using URLSession
’s completion handler-based code, you need to do all your work in the handler closure: error-handling, data parsing, and so on. When you instead use the data task publisher, you can move many of these responsibilities to Combine operators.
URLSession
のもつ完了ハンドラ基盤のコードを使う場合、あなたはあなたの仕事を全てハンドラクロージャにおいて行う必要があります:エラー処理、データ解析、など。あなたが代わりにデータタスクパブリッシャーを使う場合、あなたはこれらの責任の多くをCombine演算子へと移せます。
When a data task completes successfully, it delivers a block of raw Data
to your app. Most apps need to convert this data to their own types. Combine provides operators to perform these conversions, allowing you to declare a chain of processing operations.
データタスクがうまく完了する場合、それは生のData
のある塊をあなたのアプリに配達します。ほとんどのアプリは、このデータをそれら独自の型へと変換する必要があります。Combineは、これら変換を実行する演算子を提供して、あなたに演算処理の連鎖を宣言可能にしています。
The data task publisher produces a tuple that contains a Data
and a URLResponse
. You can use the map(_:)
operator to convert the contents of this tuple to another type. If you want to inspect the response before inspecing the data, use try
and throw an error if the response is unacceptable.
データタスクパブリッシャーは、あるタプルを生成します、それはあるData
とあるURLResponse
を含みます。あなたは、map(_:)
演算子を使って、このタプルの内容を別の型へと変換できます。あなたがデータを調査する前にその応答を調査したいならば、try
を使ってください、そしてその応答が受け入れられないものならばエラーをスローしてください。
To convert raw data to your own types that conform to the Decodable
protocol, use Combine’s decode(type:
operator.
生の値をDecodable
プロトコルに準拠するあなた独自の型へと変換するには、Combineのもつdecode(type:
演算子を使ってください。
The following example combines both these operators to parse JSON data from a URL endpoint into a custom User
type:
以下の例は、これら演算子の両方を結合して、あるURLからのJSONデータをあるあつらえのUser
型へと構文解析します:
Any app that uses the network should expect to encounter errors, and your app should handle them gracefully. Because transient network errors are fairly common, you may want to immediately retry a failed data task. With URLSession
’s completion handler idiom, you need to create a whole new task to perform a retry. With the data task publisher, you can instead use Combine’s retry(_:)
operator. This handles errors by recreating the subscription to the upstream publisher a specified number of times. However, since network operations are expensive, only retry a small number of times, and ensure all requests are idempotent.
ネットワークを使うあらゆるアプリは、出くわすエラーを予測すべきです、そしてあなたのアプリはそれらを美しく取り扱うべきです。一時的ネットワークエラーはかなり普通であることから、あなたは失敗したデータタスクを直ぐに再試行したいかもしれません。URLSession
のもつ完了ハンドラ慣用句では、あなたは再試行を実行する新しいタスク全体を作成する必要があります。データタスクパブリッシャーでは、あなたは代わりにCombineのもつretry(_:)
演算子を使用できます。これは、ある指定された回数アップストリームパブリッシャーへのサブスクリプションを再度作成することによってエラーを取り扱います。しかしながら、ネットワーク演算が高くつくことから、少ない回数を再試行するだけにしてください、そして全ての要請がべき等であるのを確実にしてください。
You can also use Combine operators to replace the error, rather than letting it reach the subscriber: あなたはまたCombine演算子それらを使ってエラーを置き換え可能です、それが加入者に届くのを許すのではなく:
catch(_:)
replaces the error with another publisher. You can use this with another URLSession
, such as one that loads data from a fallback URL.
catch(_:)
は、エラーを別のパブリッシャーで置き換えます。あなたは、これを別のURLSession
、たとえばデータを予備URLからロードするものとともに使用できます。
replace
replaces the error with an element you provide. If it makes sense in your application, you can use this to provide a substitute for the value you expected to load from the URL.
replace
は、エラーをあなたが提供する要素と置き換えます。それがあなたのアプリケーションにおいて意味をなすならば、あなたはこれを使ってある代用品を、あなたがそのURLからロードするつもりだった値に対して提供できます。
The following example shows both of these techniques, retrying a failed request once, and using a fallback URL after that. If either the original request, the retry, or the fallback request succeeds, the sink(receive
operator receives data from the endpoint. If all three fail, the sink receives a Subscribers
.
以下の例は、これらテクニックの両方、失敗したリクエストをもう一度再試行すること、そして予備URLをその後で使うことを示します。元のリクエスト、再試行、または予備リクエストのどれかが成功するならば、sink(receive
演算子はデータをエンドポイントから受け取ります。3つ全てが失敗するならば、sinkは、Subscribers
を受け取ります。
When using URLSession
’s delegate and completion handler idioms, the session calls back to your code on a fixed delegate
. Sometimes, this means your callback code has to manually use dispatch queues or other scheduling APIs to put work on a specific queue.
URLSession
のもつ委任先と完了ハンドラ慣用句を使っている場合、セッションは逆にあなたのコードをdelegate
上で呼び出します。時々、これはあなたのコールバックコードが手動でディスパッチキューや他のスケジューリングAPIを使って仕事を特定のキュー上に置かなければならないことを意味します。
With URLSession
, you can use Combine’s scheduling operators instead. Use receive(on:
to specify how you want later operators in the chain and your subscriber, to schedule the work. Dispatch
and Run
both implement Combine’s Scheduler
protocol, so you can use them to receive URL session data. The following snippet ensures that the sink logs its results on the main dispatch queue.
URLSession
では、あなたはCombineのもつスケジューリング演算子を代わりに使用できます。receive(on:
を使ってください、どのくらいあなたがより後に演算子それらをある連鎖において望むかを指定するために、仕事を予定するために。Dispatch
およびRun
両方ともCombineのもつScheduler
プロトコルを実装します、なのであなたはそれらを使ってURLセッションデータを受け取ることができます。以下の小片は、sinkがそれの結果をメインディスパッチキュー上で記録することを確実にします。
You may want to use data from the URL endpoint in different parts of your application. Because network requests are expensive, don’t reissue them needlessly. Combine lets you use multiple subscribers to a single URLSession
, while allowing the publisher to service all of them with a single request.
あなたは、URLエンドポイントからのデータをあなたのアプリケーションの異なる部分において使いたいと望むかもしれません。ネットワークリクエストは高くつくことから、それらを必要もないのに再度発令しないでください。Combineは、あなたに複数の加入者を単一のURLSession
に扱わせます、一方でそのパブリッシャーが彼らの全員に単一のリクエストでサービスを提供できるようにします。
To support multiple downstream subscribers, use the share()
operator. This operator works like a combination of the Publishers
and Passthrough
publishers. You can connect multiple operator chains or subscribers to the share()
operator, and any upstream publisher only sees one downstream. In the case of a URLSession
, this means it only performs the data task once.
複数のダウンストリーム加入者をサポートするには、share()
演算子を使ってください。この演算子は、Publishers
とPassthrough
パブリッシャーの結合物のように働きます。あなたは、複数の演算子連鎖や加入者をshare()
演算子に接続できます、そしてどんなアップストリームパブリッシャーも1つのダウンストリームを見るだけです。URLSession
の場合において、これは、それがデータタスクを一度実行するだけであるのを意味します。
The following example uses a URL session data task for two unrelated purposes. One subscriber uses the returned data to parse the custom User
type seen earlier, and logs it on the main dispatch queue. A second subscriber is only concerned with the URLResponse
, which it inspects to print an HTTP status code, and doesn’t care which queue it uses. By using share()
, the data task publisher can serve both subscribers with a single load from the URL endpoint.
以下の例は、URLセッションデータタスクを2つの関係のない目的に使います。一方の加入者は、返されるデータを使って、前に見たあつらえのUser
型を解析します、そしてそれをメインディスパッチキュー上で記録します。2番目の加入者は、それがHTTP状態コードを出力するために調査するURLResponse
に関心があるだけです、そしてどのキューをそれが使うのかは気にしません。share()
を使うことによって、データタスクパブリッシャーは、両方の加入者にURLエンドポイントからのある単一のロードで奉仕できます。
To prove that this code only loads the data once, temporarily put a print(_:
debugging operator before the share()
operator. When the app runs, Xcode’s console output shows it receives only a single value from the data task publisher, even though both subscribers receive their expected results.
このコードがデータを一度ロードするだけであることを立証するには、一時的にprint(_:
デバッギング演算子をshare()
演算子の前に置いてください。アプリが動作する時、Xcodeのもつコンソール出力は、それがある単一の値だけをデータタスクパブリッシャーから受け取ることを示します、たとえ両方の加入者が彼らの期待する結果を受け取るとしてもです。
Be aware that the URL session starts loading data as soon as the URLSession
has unsatisfied demand from a downstream subscriber. In this case, that happens when the first sink subscriber attaches. If you need extra time to attach other subscribers, use make
to wrap the Publishers
publisher with a Connectable
. After connecting all subscribers, call connect()
on the connectable publisher to allow the data load to begin.
URLSession
がダウンストリーム加入者からの満たされない要求を持つやいなや、URLセッションがデータのロードを始めることを承知していてください。この場合では、それが起こるのは最初のsink加入者が所属する時です。あなたが他の加入者を所属させるのに余分な時間が必要ならば、make
を使ってPublishers
パブリッシャーをConnectable
でラップしてください。全ての加入者が接続する後、connect()
を接続可能パブリッシャー上で呼び出して、データロードの開始を許可してください。
func dataTaskPublisher (for: URLRequest) -> URLSession.DataTaskPublisher
func dataTaskPublisher (for: URL) -> URLSession.DataTaskPublisher
struct URLSession.DataTaskPublisher