调用必须等待服务器响应的函数的问题

时间:2015-05-27 22:22:32

标签: ios json swift alamofire completionhandler

所以我的视图控制器中有以下代码可以正常工作。我发出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() 让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

    }

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

2 个答案:

答案 0 :(得分:0)

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

一个修复:

  • 从您的方法签名中移除->JSON,从您的身体移除return self.post
  • 使用func parseJSON(JSON : JSON)创建一个新方法,使用JSON
  • 执行任何操作
  • 在完成处理程序
  • 中调用此方法

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

答案 1 :(得分: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)
}

}

然后你可以调用这个方法

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