gpt4 book ai didi

ios - 从另一个线程通知 UITable

转载 作者:搜寻专家 更新时间:2023-11-01 07:06:59 26 4
gpt4 key购买 nike

我有一个简单的 UITable 实现和一个名为 fruits 的数组。摘自this例子。唯一的区别是我为 UITable 使用 UIViewController 而不是 UITableViewController,但这现在应该是无关紧要的。

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 函数。在函数中,我调用了一个线程,该线程将数组作为参数。线程正在异步地用新值填充数组。意味着我不知道是否会有任何值或值何时出现并设置到数组中。所以你可以想象在这一点上我想问什么:一旦 View 将数组加载到 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)

}
}
}

编辑 - 2017 年 11 月 21 日:

根据 Sandeep Bhandari 的回答,我在 ViewController 中更改了以下代码:

@IBOutlet weak var tableView1: UITableView!

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

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

更新:我发现如果我在 GetDataForFruitsArrayThread 线程中对 GetDataForFruitsArrayThread.array 执行 array.append(fruit) 调用,ViewController 类中的 Fruits 数组不会发生变化,因此 didSet 没有得到叫。我怎样才能改变这种行为?

最佳答案

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

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

我在做什么?简单地向数组添加了一个 setter ,每当值发生变化时,我都会重新加载 tableView。

编辑:

仅当您修改传递给 GetDataForFruitsArrayThread 的 inout fruits 数组时,上述解决方案才有效

self.thread = GetDataForFruitsArrayThread(array: &fruits)

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

关于ios - 从另一个线程通知 UITable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47327508/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com