1

したがって、View Controllerに次のコードがあり、完全に機能します。私はjsonリクエストを行い、サーバーコールが行われ、応答は問題ありません。私の関数はボタンのクリックで呼び出されます:

@IBAction func buttonClick(sender: AnyObject) {

        var postsEndpoint = "http://test.com/test"
        let test = ["Blah":"test"]

        request(.POST, postsEndpoint, parameters: test as! [String : AnyObject]   , encoding: .JSON)
            .responseJSON { (request, response, data, error) in

                if let anError = error
                {
                    // got an error in getting the data, need to handle it
                    println("error calling POST on /posts")
                    println(error)
                }
                else if let data: AnyObject = data
                {

                    let post = JSON(data)
                    // now we have the results, let's just print them though a tableview would definitely be better UI:
                     println("The post is: " + post.description)
                }
        }
}

そこで、すべてのサービスを呼び出すために使用できるクラスを作成したいと思います。したがって、このクラスで関数を作成し、ビュー コントローラーから let invoke = WebServiceCall() let jsonrequest = invoke.InvokeService() を使用して呼び出す関数を作成しました。

だから私のクラスと関数は

class WebServiceCall{


    var post:JSON = nil

    func InvokeService(type : String) ->JSON{

        var postsEndpoint = "http://test.com/test"
        let test = ["Blah":"test"]


        request(.POST, postsEndpoint, parameters: test as! [String : AnyObject]   , encoding: .JSON)
            .responseJSON { (request, response, data, error) in


                if let anError = error
                {
                    // got an error in getting the data, need to handle it
                    println("error calling POST on /posts")
                    println(error)
                }
                else if let data: AnyObject = data
                {

                    self.post = JSON(data)
                    // now we have the results, let's just print them though a tableview would definitely be better UI:
                     println("The post is: " + post.description)
                }
        }

        return self.post

    }

私の問題は、関数が呼び出されることだと思いますが、データが返されないという応答を待つ完了ハンドラーがないためです。完了ハンドラーをグーグルで検索しましたが、混乱しています。どんな助けでも素晴らしいでしょうthx

4

2 に答える 2

0

戻りは同期的に行われるため、非同期呼び出しから JSON を返すことはできません。メソッドから戻るときに、JSON が使用可能であるとは限りません (おそらくそうではありません)。

1 つの修正:

  • ->JSONメソッド署名とreturn self.post本体から削除します
  • func parseJSON(JSON : JSON)JSONでやりたいことを何でもするような新しいメソッドを作る
  • 完了ハンドラ内からこのメソッドを呼び出します

メソッド内でparseJSON(:_)、JSON (またはその他のオブジェクト) をビュー コントローラーに戻すことができます。これは通常、委譲、完了ハンドラー (コメントで言及されている Gruntcakes のように)、またはNSNotification.

于 2015-05-27T22:27:50.830 に答える