ios - swift 将从@escaping 接收到的值分配给另一个类中的实例变量

标签 ios arrays swift uitableview escaping

我相信我误解了 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()
}

P.S.:在我的辩护中,我应该说代码在 Java 中运行得很好

UPD

UIViewController.swift 中,如果在 viewWillDisappear() 中浏览我的 announcementsList,我将在那里获取我的对象。所以我假设 tableView() 开始计数元素,然后它们在 viewDidLoad() 中被重新分配。

现在的问题是如何将 viewDidLoad() 中的对象分配给新数组,而不是 tableView() 开始计算它们。

最佳答案

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

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

关于ios - swift 将从@escaping 接收到的值分配给另一个类中的实例变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52395322/

相关文章:

ios - 当 ViewController 不在窗口层次结构中时不显示警报

swift - 在代码中设置的自动布局约束未出现在界面生成器中

ios - 更改 UIViewContentModeScaleAspectFill 的工作方式

iphone - 将字符串 Url 与字符串值进行比较

c# - 如何将字符串数组转换为数组

arrays - 对数组进行排序,使元素 a[i]-a[i+1]<=a[i+1]-a[i+2] 的差值

ios - 清理代码? (Xcode 在索引时卡住)

ios - 快速向下滚动 tableView?

ios - initWithCoder 在 ios 中显示错误的帧

不同组的 PHP 返回结果