无法从JSON响应Swift将数据加载到ViewController

时间:2019-12-07 20:26:07

标签: json swift alamofire swifty-json

我在理解使用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应该返回填充的数据数组,但是那样的话,那似乎不正确

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()方法之前执行,而“ qa0”打印则是在ViewController中打印数组的大小。

现在我的问题是,有人在这里看到错误吗,是由于长时间的网络查询而发生的,还是我只是丢失了一些东西,因为在我看来,数据已正确加载和解析(在最后2个中可以看到)输出行,但我无法在需要的地方获得它,就像它消失了一样。我的逻辑错了吗?如果有人可以帮助我,我将非常感激。

1 个答案:

答案 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的完成处理程序中获取数据