我有一个简单的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的数组。