2017-03-27 7 views
0

を返すいけない非同期呼び出しにあなたが提供するクロージャは、「引数と戻り何をとらないこと30:14再マルチスレッドでの講義8に言及引数なし "。スウィフトクロージャは引数を取ることもiTunesU講師にCS193Pスタンフォード大学の講義で任意の引数

let task = session.dataTask(with: url) { (data: Data?, response, error) in ... 

も引数を返すように見える他の多くのiOSの方法があります。少しの間、後で彼は閉鎖の引数は、IE返すことができるのiOS法(37:01)の例を示しますので、それは私を驚か彼らの完了のクロージャに。私はここに何かを逃していますかなぜ非同期呼び出しで提供されるクロージャーは、上のdataTask呼び出しと同様の方法で引数を返します。

+0

"非同期呼び出し"によると、彼は "DispatchQueue.async'の呼び出しではなく、"非同期メソッドへの呼び出し "を意味する可能性が最も高いです。 – NobodyNada

+0

@NobodyNada ...はいあなたは正しいですか...彼はDispatchQueue.asyncを参照しています...だから、DispatchQueue.async呼び出しに与えられたクロージャはデータのような戻り引数を持つことができません。 session.dataTaskコールによって提供されたクロージャで「返される」応答とエラーの引数あるいは、私は単にクロージャが引数を返さないという意味を誤って解釈しています – lozflan

答えて

2

dataTask(with:)は、DispatchQueueasyncと同じものではありません。

まず、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 
) 

groupqos、そしてflagsデフォルト値を持っているので、彼らはここでは無視することができます。重要な部分は、のexecuteパラメータです。すなわち、「引数を持たず、Void(すなわちない値)を返していない閉鎖」を意味します。


The function signature for URLSession'sdataTask 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受け付けます。これらの機能のどちらも「魔法」はありません。彼らは単にクロージャを受け入れ、あなたが望むならクロージャを受け入れるための独自の関数を書くことができます。

+0

Thx。良い説明とそれは私のためにそれを明確にした。私は講師の言葉が "議論を返さない"ことを混乱させていました。 dataTaskは3つの引数を受け入れ、3つの引数を "返す"ことを混乱させるクロージャを使用します。関数のシグネチャをここにコピーして、それをはっきりと綴ってしまったのは良いことです。 – lozflan

+0

"末尾閉包"は完全に不要な構文ですが、直観的でもありません。 –

+0

@ J-Qもちろん、必要ではありません。しかし、理解することは難しくありません。多くのコードをもっときれいにしてくれます。 – NobodyNada

0

すべての非同期APIがマルチスレッドを使用するわけではありません。メモリ管理は、データがスレッド間で更新/転送されるときにはさらに考慮すべき点があります。講師のステートメントは、マルチスレッドAPIの特定のコンテキストで作成されている可能性があります。クロージャが関数呼び出しを発行した同じスレッド(またはメインスレッド)で処理されるとき、これらの考慮事項は適用されないかもしれません。

関連する問題