繁体   English   中英

快速将从@转义接收到的值分配给另一个类中的实例变量

[英]Assign value received from @escaping to instance variable in another class in swift

我相信我在Swift中误解了一些概念,并且可以将接收到的数组分配给我的实例变量。 有人可以解释为什么总体上我的announcementsList数组有0个元素吗?

UIViewController.swift

var announcementsList: [Announcement] = []

override func viewDidLoad() {
   super.viewDidLoad()
   api.getAnnouncements(){ announcements in  //<- announcements is array which has 12 elements
       for ann in announcements{
          self.announcementsList.append(ann)
       }
   }
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
     return announcementsList.count   //<- have 0 here
}

API.swift

func getAnnouncements(completion:  @escaping ([Announcement]) -> ()){
    var announcements: [Announcement] = []
    let url = URL(string: "https://api.ca/announcements")!

    let task = self.session.dataTask(with: url) {
        data, response, error in
        if let data = data,
            let json = try? JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] {
            guard let announcements_json = json!["announcements"] as? [[String: Any]]
                else { return }

            for announcement in announcements_json{
                let title = announcement["title"] as! String
                let desc = announcement["description"] as! String
                announcements.append(Announcement(title: title,desc: desc))
            }

        }
        completion(announcements)
    }
    task.resume()
}

PS:以我的辩护,我应该说代码在Java中能很好地工作

UPD

UIViewController.swift中,如果扫视一下viewWillDisappear() announcementsList ,我将把对象放在那里。 所以我假设tableView()开始计数元素,然后再在viewDidLoad()重新分配它们。

现在的问题是,如何以比tableView()开始计数更快的速度将inide viewDidLoad()对象分配给新数组。

var announcementsList: [Announcement] = [] {
    didSet {
        DispatchQueue.main.async {
            self.tableView.reloadData()
        }
    }
}

override func viewDidLoad() {
   super.viewDidLoad()
   api.getAnnouncements { announcements in
      self.announcementsList = announcements
   }
}

该操作是异步的,因此当VC出现时tableView将重新加载,此时响应尚未返回

for ann in announcements{
   self.announcementsList.append(ann)
}
self.tableView.reloadData()

顺便说一句为什么不

self.announcementsList = announcements
self.tableView.reloadData()

另外也不知道回调的当前线程,所以

DispatchQueue.main.async {
   self.announcementsList = announcements
   self.tableView.reloadData()
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM