GetDataForFruitsArrayThread

GetDataForFruitsArrayThread

我有一个简单的UITable实现和一个称为水果的数组。摘自this示例。唯一的区别是,我正在将UIViewController用于由UITableViewController插入的UITable,但这暂时不相关。

class MainViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    var fruits : [String] = Array()
    let thread : GetDataForFruitsArrayThread

    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return fruits.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "LabelCell", for: indexPath)

        cell.textLabel?.text = fruits[indexPath.row]

        return cell
    }

    }

现在我在此类中也有一个viewDidLoad函数。在函数中,我正在调用一个将数组作为参数的线程。线程用新值异步填充数组。意味着我不知道是否会有任何值,或者什么时候出现该值并将其设置到数组中。因此,您可以想像一下我要问的问题:一旦视图将数组加载到UITable中,如何向UITableView发信号通知我已更改了数组的内容。在C#中,有NotifyAll()函数将所有侦听器通知一个属性。有没有一种简便而高效的方法可以迅速地执行此操作,可以选择不导入任何未包含的库?
override func viewDidLoad() {
    super.viewDidLoad()
    self.thread = GetDataForFruitsArrayThread(array: &fruits)
    self.thread.StartAsynchronously()

}

编辑-添加GetDataForFruitsArrayThread
 class GetDataForFruitsArrayThread : MyThread {

 var array : [String]

 init(array: inout [String] ) {
   self.array = array
 }


 override func main() {

      // init socket

 while(true){

      _ = withUnsafeMutablePointer(to: &rcvaddr){
            $0.withMemoryRebound(to: sockaddr.self, capacity: 1){
      recvfrom(m_socket, &pData, bufferlength, 0, UnsafeMutablePointer($0),
               &socketAddressLength)
            }
        }

        var fruit = String(cString:inet_ntoa(rcvaddr.sin_addr), encoding: .ascii)
        self.array.append(fruit)

   }
 }
}

编辑-21.11.2017:

按照Sandeep Bhandari的回答,我在ViewController中更改了以下代码:
@IBOutlet weak var tableView1: UITableView!

var fruits : [String] = Array() {
        didSet {
            self.tableView1.reloadData()
        }
    }

问题:我在GetDataForFruitsArrayThread类的array.append(fruit)处设置了一个断点。此后,didSet方法中有一个断点。但是在append()调用之后不会调用此断点!注意:GetDataForFruitsArrayThread-class的init函数上的参数是输入输出参数!

更新:我发现如果我对GetDataForFruitsArrayThread-thread中的GetDataForFruitsArrayThread.array进行array.append(fruit)-调用,则ViewController-class中的Fruits-array不会被更改,因此didSet不会被调用。我该如何改变这种行为?

最佳答案

因为您说过您正在运行一个无休止的过程来不断更新阵列,并且您希望UI在阵列更改后立即更新,所以可以使用以下解决方案。

var fruits : [String] = Array() {
        didSet {
            self.tableView.reloadData()
        }
    }

我在做什么 ? Simple向数组添加了一个setter,并且每当值更改时,我都会重新加载tableView。

编辑:

仅当您修改传递给GetDataForFruitsArrayThread的inout水果数组时,以上解决方案才有效
self.thread = GetDataForFruitsArrayThread(array: &fruits)

因此,不要在GetDataForFruitsArrayThread中再创建一个数组属性,而是直接修改传递给GetDataForFruitsArrayThread的数组。

09-06 20:04