dataTask(with:)
は、DispatchQueue
のasync
と同じものではありません。
まず、trailing closureを使用していることに注意してください。関数の最後の引数がクロージャ(すなわち、コードの「ブロック」)である場合、クロージャは、かっこの外側に配置されてもよい。末尾の閉鎖構文を使用して、次のコード、:
someQueue.async {
//do something
}
は、末尾の閉鎖構文を使用していません。:
someQueue.async(execute: {
//do something
})
また、閉鎖が行うことに注意してください、次のコードと等価ですパラメータを返すのではなく、を受け入れます。パラメータ。パラメータはクロージャへの入力ですが、戻り値はクロージャからの出力です。
The function signature for DispatchQueue
's async
is:
func async(
group: DispatchGroup? = default,
qos: DispatchQoS = default,
flags: DispatchWorkItemFlags = default,
execute work: @escaping() -> Void
)
group
、qos
、そしてflags
デフォルト値を持っているので、彼らはここでは無視することができます。重要な部分は、のexecute
パラメータです。すなわち、「引数を持たず、Void
(すなわちない値)を返していない閉鎖」を意味します。
The function signature for URLSession's
dataTask
method is:
func dataTask(
with request: URLRequest,
completionHandler: @escaping (Data?, URLResponse?, Error?) -> Void
) -> URLSessionDataTask
completionHandler
それは三つのパラメータ(オプションData
、任意、及び任意Error
)を受け入れ、Void
を返す意味し、タイプ@escaping (Data?, URLResponse?, Error?) -> Void
です。
両方の関数は、クロージャをパラメータとして受け入れますが、異なるシグネチャでクロージャを受け入れます。 async
はパラメータを受け入れない閉鎖を受け付けたが、3つのパラメータを受け入れる閉鎖をdataTask
受け付けます。これらの機能のどちらも「魔法」はありません。彼らは単にクロージャを受け入れ、あなたが望むならクロージャを受け入れるための独自の関数を書くことができます。
"非同期呼び出し"によると、彼は "DispatchQueue.async'の呼び出しではなく、"非同期メソッドへの呼び出し "を意味する可能性が最も高いです。 – NobodyNada
@NobodyNada ...はいあなたは正しいですか...彼はDispatchQueue.asyncを参照しています...だから、DispatchQueue.async呼び出しに与えられたクロージャはデータのような戻り引数を持つことができません。 session.dataTaskコールによって提供されたクロージャで「返される」応答とエラーの引数あるいは、私は単にクロージャが引数を返さないという意味を誤って解釈しています – lozflan