我有一个在json中返回响应的Web服务。 我在iphone的xcode(swift)中为数据访问创建了一个单独的类。 我想要做的是在数据访问层中调用一个函数,该函数返回响应字典,WHEN FETCHING IS COMPLETE。 问题:如何仅在从服务获取完成时返回。 例如:学生表 - >点击学生 - >获取学生数据 - >获取完毕后返回数据
func getUser(userID:String)->NSDictionary{
let manager = AFHTTPRequestOperationManager()
let parameters = ["uid":userID]
manager.POST(urlStudentInfo, parameters: parameters,
success: {(operation: AFHTTPRequestOperation!,responseObject: AnyObject!) in
print("JSON success: " + responseObject.description)
if let responseDic = responseObject as? NSDictionary{
let isUser = responseDic["status"] as! Bool
if isUser{
}else{
}
}
},
failure: { (operation: AFHTTPRequestOperation!,error: NSError!) in
})
return response
}
这是我的功能结构。返回完成后会出现问题。所以回报总是零。
任何人都有建议在提取完成后才返回?
答案 0 :(得分:1)
{callService}
实际上是什么样的?它有完成处理程序吗?但一般来说,像webservices这样的异步函数不能像普通函数一样被考虑,你需要在一个函数中启动ws调用,然后调用另一个函数让某些东西知道它是从完成处理程序中完成的,或者是什么让ws函数知道它已完成。简而言之,您不应该尝试从该函数返回任何内容,而是从完成处理程序返回值
编辑:
我建议不要使用NSNotifications,而是委托回调,或者直接使用完成处理程序中的数据。但无论是什么尝试使用返回的NSDictionary应该是这个函数所在的类的委托(如果你不知道它是如何工作的,请查阅协议的教程),然后你可以通过完成内部的委托回调传递字典handler(想想UITableviews如何让你实现所有这些功能以使其工作,你需要为你的webservice调用做类似的事情)
this answer可能会帮助您理解我的意思
答案 1 :(得分:0)
因为您正在调用异步方法,所以不应尝试立即返回值。相反,提供一个“完成处理程序”闭包,您可以在稍后返回结果时调用它。
我还建议至少使用AFNetworking 3.x(因为AFNetworking 2.x的AFHTTPRequestOperationManager
使用的NSURLConnection
现已弃用了:
func getUser(userID:String, completionHandler: (NSDictionary?, NSError?) -> ()) {
let manager = AFHTTPSessionManager()
let parameters = ["uid":userID]
manager.POST(urlStudentInfo, parameters: parameters, progress: nil, success: { task, responseObject in
if let responseDic = responseObject as? NSDictionary, let isUser = responseDic["status"] as? Bool {
if isUser{
completionHandler(responseDic, nil)
} else {
let error = NSError(domain: NSBundle.mainBundle().bundleIdentifier!, code: 1, userInfo: [NSLocalizedDescriptionKey: "status false"])
completionHandler(nil, error)
}
} else {
let error = NSError(domain: NSBundle.mainBundle().bundleIdentifier!, code: 2, userInfo: [NSLocalizedDescriptionKey: "Response not dictionary; or status not found"])
completionHandler(nil, error)
}
}, failure: { task, error in
completionHandler(nil, error)
})
}
你会这样称呼它:
getUser(userID) { responseDictionary, error in
guard responseDictionary != nil && error == nil else {
print(error)
return
}
// do something with responseDictionary here
}
// but do not try to use responseDictionary here, because the above runs asynchronously
或者,甚至更好,您可以考虑使用Alamofire。例如,请参阅https://stackoverflow.com/a/27393174/1271826。