-1

この同じ問題について他のいくつかの質問を読みましたが、どういうわけか、完了ハンドラーは他の回答とは異なります。また、これらの回答は2015年のものであるため、Swift 1.xに固有のものであるかどうか疑問に思います

とにかく、ここに私の問題があります。通常の GET 呼び出しを行っており、ダウンロードしたデータを呼び出し元のメソッドに返したいと考えています。どういうわけか、これは私にとってはうまくいきたくありません。

これが私がやっていることのコードです(すべて単一のViewControllerクラス内にあります):

override func viewDidLoad() {
    super.viewDidLoad()

    // get initial GET call
    getConfigurationLink();
}

func getConfigurationLink(completionHandler:String?) -> Void
{
    let collectionUrl = NSURL(string: collectionUrlString);

    let configuration = NSURLSessionConfiguration.defaultSessionConfiguration();
    let headers: [NSObject : AnyObject] = ["Accept":"application/json"];
    configuration.HTTPAdditionalHeaders = headers;
    let session = NSURLSession(configuration: configuration);

    let configurationUrlTask = session.dataTaskWithURL(collectionUrl!) {(data, response, error) in

        completionHandler("test")
    }

    configurationUrlTask.resume()
}

このコードでは、 の行がcompletionHandler("test")コンパイルに失敗し、Cannot call value of non-function type String?メッセージが表示されます。

だから私の質問は:

  1. メソッドに引数として渡すことができる conpletionHandler を作成するにはどうすればよいですか?

  2. 完了ハンドラが失敗するのはなぜですか?

完了ハンドラーがない場合、予想どおり、メソッドはネットワーク呼び出しが完了する前に null 値を返すだけです。

ありがとう。

4

1 に答える 1

0

現在の関数定義のタイプcompletionHandlerはオプションの文字列であり、関数ではありません。データタスクが終了したときに呼び出す関数にしたい場合はcompletionHandler、関数定義を に変更しますfunc getConfigurationLink(completionHandler: String? -> ())。したがってcompletionHandler、オプションの文字列をパラメーターとして受け取る関数を次に示します。

関数を別の関数のパラメーター型として渡す方法を読むことができます (ここでやろうとしているのは、completionHandler関数を渡してからネットワーク要求が完了したときgetConfigurationLinkに呼び出すことです) ここで: https://developer.apple .com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Functions.html#//apple_ref/doc/uid/TP40014097-CH10-ID166completionHandler

CompeletionHandlers についてのもう少しの説明: https://thatthinginswift.com/completion-handlers/

getConfigurationLink次のようにクロージャーを使用して呼び出すことができます。

getConfigurationLink { (str: String?) in
    // you can use str here
}

クロージャーの詳細は次のとおりです。https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Closures.html

于 2016-06-05T02:34:42.040 に答える