繁体   English   中英

Swift:如何处理表视图与方法更新表视图之间的同步

[英]Swift: How to handle synchronisation between table view and method updating table view

我有一个数组,它正在迅速地被另一种方法不断更新,并且更新后还需要将其加载到表视图中。 经常调用更新数组的方法。 我遇到穿线问题。 调用更新方法时,我尝试在数组上使用锁。 它确实有所改进,但效果也不佳。 我收到fatal error: Index out of range如果数组中有大量元素(大约> 50),则更新表时fatal error: Index out of range

什么是处理这种情况并使其成为线程安全的最佳方法? 我是Swift的新手。

下面是更新myArray的函数:

func updateMyArray() {
       objc_sync_enter(self.myArray)
                //do some stuff with my Array
        //…………add some elements in array………
        //…………remove some elements in array……
                DispatchQueue.main.async {
                    self.myTable.reloadData()
                    }
       objc_sync_exit(self.myArray)

    }

下面是表委托方法:

func numberOfRows(in tableView: NSTableView) -> Int {
      return myArray.count
}

func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
        var cellText: String = myArray[row]
        if let cell = myTable.make(withIdentifier:  “myCellIdentifier", owner: nil) as? NSTableCellView {
            cell.textField?.stringValue = cellText
            return cell
        }
}

每10秒调用一次updateMyArray()

override func viewDidAppear() {
        _ = Timer.scheduledTimer(timeInterval: 10.0, target: self, selector: #selector(self.updateMyArray), userInfo: nil, repeats: true)
     }

通过按下刷新按钮来调用updateMyArray()

@IBAction func refreshMyArray(_ sender:NSButton){
     self.updateMyArray()
}

在声明数组时,添加以下内容:

var myArray=[type]() {
   didSet{
       DispatchQueue.main.async {
          self.myTable.reloadData()
        }
    }
}

因此,无论何时更新数组,tableView都会重新加载适当的数据。

这对我有用:

在updateMyArray()方法中:

func updateMyArray() {
        self.updatingTableData = true
        //do some stuff with my Array
        //…………add some elements in array………
        //…………remove some elements in array……     
       self.updatingTableData = false
        //following can also be done in didSet part of myArray variable
       DispatchQueue.main.async {
             self.myTable.reloadData()
       }

    }

在表视图委托方法中:

func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
        if self.updatingTableData == true || row >= self.printers.count {
                 return nil
        }
        var cellText: String = myArray[row]
        if let cell = myTable.make(withIdentifier:  “myCellIdentifier", owner: nil) as? NSTableCellView {
            cell.textField?.stringValue = cellText
            return cell
        }
}

暂无
暂无

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

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