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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将从@escaping接收的值分配给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()
}

P.S。:在我的辩护中,我应该说代码在Java中很好用

UPD

在UIViewController.swift中,如果在announcementsListviewWillDisappear()里面看一眼,我会在那里得到我的物品。所以我假设tableView()开始计算元素,然后他们在viewDidLoad()重新分配。

现在的问题是如何将qazxsw poi中的对象分配给一个比qazxsw poi更快的新数组开始计算它们。

答案
viewDidLoad()
另一答案

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

tableView()

BTW为什么不呢

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

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

也不知道回调的当前线程,所以这样做

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

以上是关于将从@escaping接收的值分配给swift中另一个类中的实例变量的主要内容,如果未能解决你的问题,请参考以下文章

Swift:如何将从委托接收到的值传递给函数的完成块?

将值从闭包赋值给变量 Swift

创建一个新变量,它是python中另一个变量的每周最小值/最大值

Swift 无法将类型“()”的值分配给类型“字符串?”

“无法将类型 'String' 的值分配给类型 'AnyObject?'”,Swift 3,Xcode 8 beta 6

错误:无法将“[String]”类型的值分配给 swift 中的“String”类型