Return 数据来自 swift 中的 http sendAsyncRequest 调用
Return data out of http sendAsyncRequest call in swift
好的,首先,我已经阅读了其他几本关于这个主题的 post,我知道我要描述的可能是一个同步调用,但我真正需要的是获取数据和使用它,所以如果我应该从其他方向看,请告诉我:
我必须调用 api 来检索 json 对象并使用它们来填充 table 视图。我的问题是我无法传递/return 数据来处理它:
在控制器中:
callProjectTypes()
var testjson = JSON(data:test)
println("should print some data")
println(testjson[0])
调用函数:
func callProjectTypes() -> (NSData) {
var data = NSData()
serverCall("http://url/to/project/types") {
responseData, error in
if responseString == nil {
println("Error during post: \(error)")
return
}
// use responseData here
data = responseData
}
return data
}
func serverCall(url: String, completionHandler: (responseData: NSData!, error: NSError!) -> ()) {
var URL: NSURL = NSURL(string: url)!
var request:NSMutableURLRequest = NSMutableURLRequest(URL:URL)
request.HTTPMethod = "GET";
var creds = encodeCredentials()
request.addValue("\(creds)", forHTTPHeaderField: "Authorization")
NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue()){
response, data, error in
var output: NSData!
if data != nil {
output = data
}
completionHandler(responseString: output, error: error)
}
}
println(testjson[0])
总是 return "nill
" 所以我假设 callProjectTypes
函数中的 "return data
" 在数据到达之前返回。
我应该怎么做才能完成这项工作?
你不能return那样使用异步。
您必须对闭包中的数据执行所需的所有操作。
你必须这样做:
func callProjectTypes(action: NSData->()) {
serverCall("http://url/to/project/types") { responseData, error in
if responseData == nil {
println("Error during post: \(error)")
return
}
action(responseData)
}
}
callProjectTypes { data in
let testjson = JSON(data:data)
println("should print some data")
println(testjson[0])
}
到 return 值异步你不能使用 return 语句,因为你不能保证 'serverCall' 在执行 return 语句时已经完成。相反,您必须以异步方式 return 'data' 值,例如通过向 'callProjectTypes' 本身提供回调。示例:
callProjectTypes()
{
(data : NSData) in
let testjson = JSON(data:data)
println("should print some data")
println(testjson[0])
}
异步函数必须接受并执行回调:
func callProjectTypes(callback: (data : NSData)->Void)
{
serverCall("http://url/to/project/types") {
responseData, error in
callback(responseData)
}
现在你可以保证回调中的代码只会在数据被'serverCall'return编辑后执行。
好的,首先,我已经阅读了其他几本关于这个主题的 post,我知道我要描述的可能是一个同步调用,但我真正需要的是获取数据和使用它,所以如果我应该从其他方向看,请告诉我:
我必须调用 api 来检索 json 对象并使用它们来填充 table 视图。我的问题是我无法传递/return 数据来处理它:
在控制器中:
callProjectTypes()
var testjson = JSON(data:test)
println("should print some data")
println(testjson[0])
调用函数:
func callProjectTypes() -> (NSData) {
var data = NSData()
serverCall("http://url/to/project/types") {
responseData, error in
if responseString == nil {
println("Error during post: \(error)")
return
}
// use responseData here
data = responseData
}
return data
}
func serverCall(url: String, completionHandler: (responseData: NSData!, error: NSError!) -> ()) {
var URL: NSURL = NSURL(string: url)!
var request:NSMutableURLRequest = NSMutableURLRequest(URL:URL)
request.HTTPMethod = "GET";
var creds = encodeCredentials()
request.addValue("\(creds)", forHTTPHeaderField: "Authorization")
NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue()){
response, data, error in
var output: NSData!
if data != nil {
output = data
}
completionHandler(responseString: output, error: error)
}
}
println(testjson[0])
总是 return "nill
" 所以我假设 callProjectTypes
函数中的 "return data
" 在数据到达之前返回。
我应该怎么做才能完成这项工作?
你不能return那样使用异步。
您必须对闭包中的数据执行所需的所有操作。
你必须这样做:
func callProjectTypes(action: NSData->()) {
serverCall("http://url/to/project/types") { responseData, error in
if responseData == nil {
println("Error during post: \(error)")
return
}
action(responseData)
}
}
callProjectTypes { data in
let testjson = JSON(data:data)
println("should print some data")
println(testjson[0])
}
到 return 值异步你不能使用 return 语句,因为你不能保证 'serverCall' 在执行 return 语句时已经完成。相反,您必须以异步方式 return 'data' 值,例如通过向 'callProjectTypes' 本身提供回调。示例:
callProjectTypes()
{
(data : NSData) in
let testjson = JSON(data:data)
println("should print some data")
println(testjson[0])
}
异步函数必须接受并执行回调:
func callProjectTypes(callback: (data : NSData)->Void)
{
serverCall("http://url/to/project/types") {
responseData, error in
callback(responseData)
}
现在你可以保证回调中的代码只会在数据被'serverCall'return编辑后执行。