[swift]试图访问响应全球

发布时间: 2017/3/4 20:33:16
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我使用的 Alamofire 和响应的时候我想将它设置为我可以在任何地方访问的变量。这里是我得到了什么

var data: NSData?
Alamofire.request(.POST, "http://localhost/api/notifications", parameters: parameters)
    .responseJSON { (request, response, JSON, error) in
           let data: AnyObject? = JSON
    }
println(data)

当我运行我得到 nil ...有什么想法?我知道要求是好的因为我可以看到的范围内响应时我不将其分配给一个变量。

解决方法 1:

Almofire.request是一个异步的函数。你叫它,它将立即; 返回之前它其实请求。所以, println(data) 之前任何曾经设置获取调用 data 的东西比其他 nil 。实际已完成的请求时,Alamofire 将调用的关闭您将传递给 responseJSON ,因为封闭就是你会想要实际使用 data (打印或者其他什么)︰

Alamofire.request(.POST, "http://localhost/api/notifications", parameters: parameters)
    .responseJSON { (request, response, JSON, error) in
        let data: AnyObject? = JSON
        // do something useful with data
        println(data)
    }

从评论质疑︰

但然后让说我想要将该数据转换为表格。我只会把内关闭所有表代码吗?

可以把所有这些代码内关闭,但这可能会很快得到混乱。更好的方式来处理是实现相同的模式, Alamofire.request 使用。基本上,使您自己的功能将需要关闭作为参数的要求。然后,关闭你传递给 responseJSON ,调用传递给该函数传递给它的关闭 data 。然后,使一个单独的函数"将该数据转换为表格",并要求它与 data 从你关闭。就像这个样子︰

func callSomeAPI(resultHandler: (data: AnyObject?) -> ()) -> () {
    Alamofire.request(.POST, "http://localhost/api/notifications", parameters: parameters)
        .responseJSON { (request, response, JSON, error) in
           let data: AnyObject? = JSON
           resultHandler(data)
    }
}

func makeTable(data: AnyObject?) -> () {
    // make your table
}

callSomeAPI() { data in
    makeTable(data)
}

注︰你可能会想要转换 data 的东西比其他 AnyObject? 在一些点在那里。

官方微信
官方QQ群
31647020