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

标签 json swift alamofire swifty-json

我在理解通过 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应该返回填充的数据数组,但该流程似乎不正确

console output

控制台输出文本

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/

相关文章:

javascript - 访问多维对象 JavaScript

ios - 如何在 tableview 中快速设置索引

ios - 使用 Swift 4 和 Alamofire 获取客户端证书以用于 Https 调用身份验证

ajax - 更改jquery中的缓存时间

c# - 在 C# 中循环遍历 json 数组

javascript - JavaScript 中的 Cookie 数组

swift - 将 Objective-C 框架导入 Swift 项目时在 Bridging Header 中获取 "file not found"

ios - Swift:在 View 之间传递变量而不是第一次更新

ios - 使用 Content-Type : multipart/form-data 发出 Alamofire 请求

ios - 如何从 UIImagepicker 中选取动画图像并将其添加到 UIimageview 并上传