JSON数据显示在viewDidAppear而非viewDidLoad上

时间:2018-07-25 08:42:57

标签: ios swift swifty-json

我具有下载JSON的功能,并将其附加到数组中

    func downloadDetails(completed: @escaping DownloadComplete){
    Alamofire.request(API_URL).responseJSON { (response) in
        let result = response.result
        let json = JSON(result.value!).array
        let jsonCount = json?.count
        let count = jsonCount!

        for i in 0..<(count){
            let image = json![i]["urls"]["raw"].stringValue
            self.imagesArray.append(image)
        }
        self.tableView.reloadData()
        print(self.imagesArray)

        completed()
    }
}

我知道viewDidLoad首先加载,viewDidAppear之后加载。我正在尝试检索包含所有信息的数组,但由于该数组为空,因此未显示在viewDidLoad上,但它以10个数组显示在viewDidAppear上,我不知道如何从中获取该信息。 viewDidAppear

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {

@IBOutlet weak var tableView: UITableView!

var imageList: Image!
var imagesArray = [String]()

override func viewDidLoad() {
    super.viewDidLoad()
    print("viewDidLoad " ,imagesArray)
    setupDelegate()
}

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    downloadDetails {
        DispatchQueue.main.async {

        }
        print("viewDidAppear ", self.imagesArray)
    }
}

输出如下

viewDidLoad  []

viewDidAppear  ["https://images.unsplash.com/photo-1464550883968-cec281c19761", "https://images.unsplash.com/photo-1464550838636-1a3496df938b", "https://images.unsplash.com/photo-1464550580740-b3f73fd373cb", "https://images.unsplash.com/photo-1464547323744-4edd0cd0c746", "https://images.unsplash.com/photo-1464545022782-925ec69295ef", "https://images.unsplash.com/photo-1464537356976-89e35dfa63ee", "https://images.unsplash.com/photo-1464536564416-b73260a9532b", "https://images.unsplash.com/photo-1464536194743-0c49f0766ef6", "https://images.unsplash.com/photo-1464519586905-a8c004d307cc", "https://images.unsplash.com/photo-1464519046765-f6d70b82a0df"]

访问其中包含信息的数组的正确方法是什么?

2 个答案:

答案 0 :(得分:0)

那是因为请求是异步的,它没有作为串行代码行执行,因此根据网络状态应该有一个延迟,除了您甚至没有在downloadDetails内调用viewDidLoad

//

您还需要在此处重新加载表格

downloadDetails {  // Alamofire callback by default runs in main queue
    self.tableView.reloadData()
}

答案 1 :(得分:0)

只需在

上调用您的方法
viewDidLoad()

也许您应该了解有关iOS生命周期的更多信息,以便可以发现 viewDidLoad viewDidAppear

之间的区别