我在理解通过 SWIFT 使用 REST api 服务的过程时遇到了问题,似乎我错过了一些简单但又重要的东西。
这是单例 DataManager 类,我使用 loadNews() 方法来使用 API,如您所见,它很简单,请求方法、getter 和初始化程序将加载数据。
对于 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() 实例时,由于某种原因我无法读取 Controller 中的数据,这是 Controller 代码(相关代码):
class SecondViewController: UITableViewController {
override func viewDidLoad() {
super.viewDidLoad()
let data1 = DataManager.shared.getNews()
print("qa \(data1.count)")
}
...
}
现在困扰我的是 - 背后的逻辑应该很简单,let data1 = DataManager.shared.getNews() - 如果我没有错的话将(应该)执行以下流程:
init()->loadNews()->getNews() 初始化方法将调用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() 方法之前执行,以及打印 ViewController 中数组大小的“qa0”打印。
现在我的问题是,有人在这里看到错误吗,这是因为长时间的网络查询而发生的,还是我只是错过了一些东西,因为在我看来,数据已正确加载和解析,这在最后 2 中看到输出行,但我无法将其放在需要的地方,就像它消失一样。我这里的逻辑是错误的吗?如果有人可以提供帮助,我将非常感激。
最佳答案
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
中的完成处理程序获取数据
关于json - 无法将数据从 JSON 响应快速加载到 ViewController 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59229881/