1

所以我的视图控制器中有以下代码可以完美运行。我发出 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

    }

我认为我的问题是调用了该函数,但是因为没有完成处理程序来等待我从未得到返回数据的响应。我用谷歌搜索了完成处理程序,但我很困惑。任何帮助都会很棒

4

2 回答 2

0

您不能从异步调用中返回 JSON,因为返回是同步发生的。当从该方法返回时,不能保证 JSON 可用(并且可能不可用)。

一个修复:

  • ->JSON您的方法签名和return self.post您的身体中删除
  • 制作一个新方法,比如func parseJSON(JSON : JSON)用 JSON 做任何你想做的事情
  • 从完成处理程序中调用此方法

parseJSON(:_)方法内部,您可以将 JSON(或任何其他对象)传递回您的视图控制器。这通常通过委托、完成处理程序(如评论中提到的 Gruntcakes)或NSNotification.

于 2015-05-27T22:27:50.830 回答
0
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

}

将此更改为

var post:JSON = nil

func InvokeService(type : String, compHandler: (NSRequest, NSresponse, NSData, NSError) -> Void){

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
    compHandler(request, response, data, error)
}

}

然后你可以调用这个方法

注意:此代码未经测试。所以也许你需要改变一点。

于 2015-05-27T22:39:33.973 回答