나는 단순한 UITable 구현과 과일이라고 불리는 배열을 가지고있다. 예 : this. 유일한 차이점은 UITableViewController의 UITable insted에 UIViewController를 사용하고 있지만 이것은 현재 부적합해야합니다.다른 스레드에서 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#에는 NotifierAll() 함수가 있는데,이 함수는 모든 Listener를 특성에 알리지 않습니다. 선택적으로 포함되지 않은 라이브러리를 가져 오지 않고도 빠르고 쉽게 수행 할 수있는 쉽고 효율적인 방법이 있습니까?
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일 :
@IBOutlet weak var tableView1: UITableView!
var fruits : [String] = Array() {
didSet {
self.tableView1.reloadData()
}
}
:하기 Sandeep 반 다리의 대답에 따라
는 내가의 ViewController에 다음 코드를 변경 문제 : 나는 GetDataForFruitsArrayThread 클래스의 array.append (과일)에 중단 점. 그 후 didSet 메소드에 중단 점이 있습니다. 그러나이 중단 점은 append() - 호출 후에 호출되지 않습니다! 참고 : GetDataForFruitsArrayThread 클래스의 init 함수에있는 매개 변수는 in-out 매개 변수입니다!
업데이트 : GetDataForFruitsArrayThread 스레드의 GetDataForFruitsArrayThread.array에서 array.append (fruit) -call을 수행하면 ViewController 클래스의 Fruits 배열이 변경되지 않으므로 didSet이 변경되지 않았다는 것을 알았습니다. 전화 받기. 어떻게이 행동을 바꿀 수 있습니까?
메서드에 Closure 매개 변수를 추가하면 네트워크 기능이 끝날 때 알림을받을 콜백이됩니다. –
함수가 완전히 끝나지 않습니다. 앱이 실행되는 동안 네트워크에서 패킷을 수신하려고하는 무한 스레드입니다. 요소가 추가 될 때마다 호출되는 매개 변수로 핸들을 전달해야한다는 것을 의미합니까? 그렇다면 핸들러가 트리거되면 ViewController에서 어떤 일이 발생해야합니까? 어떻게 든 UITable 재로드가 가능합니까? – David
동일한 접근법이 클로저를 추가하고 객체 클로저를 매개 변수로 사용하여 필요할 때마다이 클로저를 호출합니다. 클로저가 호출되면 객체의 viewController 배열을 업데이트하고 UITableView를 업데이트해야합니다. –