无法从 JSON 响应快速将数据加载到 ViewController 中



>我在理解使用 SWIFT 使用 REST api 服务的过程时遇到问题,似乎我错过了一些简单但在这里很重要的东西。

这是单例 DataManager 类,我正在使用 API 和 loadNews(( 方法,如您所见,它很简单,请求方法、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)
}     
}
}

我面临的问题是,当我尝试在我的视图控制器中调用 DataManager(( 实例时,由于某种原因我无法读取控制器中的数据,这是控制器代码(相关代码(:

class SecondViewController: UITableViewController {
override func viewDidLoad() {
super.viewDidLoad()
let data1 = DataManager.shared.getNews()
print("qa (data1.count)")
}
...
}

现在困扰我的是 - 这背后的逻辑应该很简单,让 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(( 方法之前执行,以及"qa0"打印在 ViewController 中打印数组的大小。

现在我的问题是,有没有人在这里看到错误,这是因为长时间的网络查询而发生的,还是我只是错过了一些东西,因为在我看来,数据被正确加载和解析,这在输出的最后 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

最新更新