我在理解使用SWIFT消费REST api服务的过程时遇到了一个问题,似乎我缺少一些简单但很重要的东西。
这是单例DataManager类,我正在使用loadNews()方法来使用API,如您所见,它将加载数据的简单的request方法,getter和initializer。
对于loadNews(),我使用Alamofire处理请求,并使用SwiftyJSON解析响应。
class DataManager{
static let shared = DataManager()
private var data:JSON = JSON()
private init(){
print("testprint1 \(self.data.count)")
loadNews() { response in
self.data = response
print("initprint \(self.data.count)")
print(self.data["response"]["results"].count)
print(self.data["response"]["results"][0]["id"].stringValue)
}
print("testprint2 \(self.data.count)")
}
func getNews() -> JSON {
return data
}
func loadNews(completion: @escaping (JSON) -> ()){
Alamofire.request("...")
.responseJSON{ response in
guard response.result.isSuccess,
let value = response.result.value else {
print("Error: \(String(describing: response.result.error))")
completion([])
return
}
let json = JSON(value)
completion(json)
}
}
}
我面临的问题是当我尝试在ViewController中调用DataManager()实例时,由于某种原因我无法在控制器中读取数据,这是控制器代码(相关代码):< / p>
class SecondViewController: UITableViewController {
override func viewDidLoad() {
super.viewDidLoad()
let data1 = DataManager.shared.getNews()
print("qa \(data1.count)")
}
...
}
现在让我感到困扰的是-这背后的逻辑应该很简单,让data1 = DataManager.shared.getNews()-如果我没记错的话(应该)执行以下流程:< / p>
init()-> loadNews()-> getNews() initialize方法将调用loadNews,loadNews将从API提取数据,填充数据数组,而getNews应该返回填充的数据数组,但是那样的话,那似乎不正确
控制台输出文本
testprint1 0
testprint2 0
qa 0
initprint 1
50
commentisfree/2019/dec/07/lost-my-faith-in-tech-evangelism-john-naughton
因此,似乎两个init()中的打印均要在它们之间的loadNews()方法之前执行,而“ qa0”打印则是在ViewController中打印数组的大小。
现在我的问题是,有人在这里看到错误吗,是由于长时间的网络查询而发生的,还是我只是丢失了一些东西,因为在我看来,数据已正确加载和解析(在最后2个中可以看到)输出行,但我无法在需要的地方获得它,就像它消失了一样。我的逻辑错了吗?如果有人可以帮助我,我将非常感激。
答案 0 :(得分:0)
Alamofire进程异步运行,但是您不认为这是错误的。
将代码更改为
class DataManager{
static let shared = DataManager()
func loadNews(completion: @escaping (JSON) -> ()){
Alamofire.request("...")
.responseJSON{ response in
guard response.result.isSuccess,
let value = response.result.value else {
print("Error:", response.result.error)
completion([])
return
}
let json = JSON(value)
completion(json)
}
}
}
class SecondViewController: UITableViewController {
override func viewDidLoad() {
super.viewDidLoad()
DataManager.shared.loadNews() { response in
print("initprint \(response.count)")
print(response["response"]["results"].count)
print(response["response"]["results"][0]["id"].stringValue)
}
}
...
}
您必须从SecondViewController
的完成处理程序中获取数据