【发布时间】:2017-11-16 10:41:10
【问题描述】:
我有一个简单的 UITable 实现和一个名为 fruits 的数组。取自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 类的 init 函数上的参数是一个 in-out 参数!
更新:我发现如果我对 GetDataForFruitsArrayThread 线程中的 GetDataForFruitsArrayThread.array 执行 array.append(fruit)-call,ViewController-class 中的 Fruits-array 不会改变,因此 didSet 没有得到叫。我该如何改变这种行为?
【问题讨论】:
-
在你的方法中添加一个闭包参数,当你的网络函数结束时得到通知的回调
-
该函数根本没有结束,它是一个无限线程,在应用程序运行时尝试从网络接收数据包。你的意思是我应该传递一个句柄作为参数,每次添加元素时都会调用它?如果是,那么如果触发了处理程序,ViewController 会发生什么? UITable 以某种方式重新加载,这怎么可能?
-
其相同的方法添加一个闭包并使用您的对象数组作为参数执行此闭包,每次您需要时,当调用此闭包时,您必须更新您的 viewController 对象数组并更新您的 UITableView根据
-
你有关于这个闭包的一些例子/样本吗?我不完全明白它应该做什么
-
我认为也许你的
viewController充当你的GetDataForFruitsArrayThread的代表可以通知你的viewController,你还必须在你的类范围内声明你的线程变量,我不是100%肯定但是可能在 viewDidLoad 结束后被释放,这是另一种方法
标签: ios arrays swift uitableview data-binding