2017-11-16 3 views
1

나는 단순한 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이 변경되지 않았다는 것을 알았습니다. 전화 받기. 어떻게이 행동을 바꿀 수 있습니까?

+0

메서드에 Closure 매개 변수를 추가하면 네트워크 기능이 끝날 때 알림을받을 콜백이됩니다. –

+0

함수가 완전히 끝나지 않습니다. 앱이 실행되는 동안 네트워크에서 패킷을 수신하려고하는 무한 스레드입니다. 요소가 추가 될 때마다 호출되는 매개 변수로 핸들을 전달해야한다는 것을 의미합니까? 그렇다면 핸들러가 트리거되면 ViewController에서 어떤 일이 발생해야합니까? 어떻게 든 UITable 재로드가 가능합니까? – David

+0

동일한 접근법이 클로저를 추가하고 객체 클로저를 매개 변수로 사용하여 필요할 때마다이 클로저를 호출합니다. 클로저가 호출되면 객체의 viewController 배열을 업데이트하고 UITableView를 업데이트해야합니다. –

답변

2

배열을 계속 업데이트하기 위해 끝없는 프로세스를 실행 중이며 어레이가 변경된 후에 UI 업데이트를 원한다고 말했기 때문에 아래 솔루션을 사용할 수 있습니다.

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

내가 뭘하고 있니? Simple은 배열에 setter를 추가하고 값이 변경 될 때마다 tableView를 다시로드합니다.

편집 :

위의 솔루션은 당신이 GetDataForFruitsArrayThread

self.thread = GetDataForFruitsArrayThread(array: &fruits) 

에 전달하는 입출력 과일 배열을 수정하면 오히려 직접 그래서 GetDataForFruitsArrayThread에 또 하나의 배열 속성을 생성하지 않는에만 작동 수정합니다 배열은 GetDataForFruitsArrayThread에 전달됩니다.

+0

편집하면 GetDataForFruitsArrayThread'의 생성자에서이 작업을 수행하지 말아야합니다. self.array = fruits. 권리? 그렇다면 main() 함수에서 fruits 변수에 액세스 할 수 있습니까? 배열 변수에 안전하지 않은 경우 어떻게해야합니까? – David

+0

@ david : 아니, 아니에요, 당신이하고있는 일이 무엇을 의미하는지 아니에요 :) 내가 무슨 뜻인지 당신에게 전달되어 배열의 별도 인스턴스를 만들지 않는 배열의 동일한 인스턴스를 사용합니다. 나는 당신이 깊은 n 얕은 사본을 알고 있기를 바랍니다. InOut 매개 변수는 참조로 전달됩니다. 그래서 같은 참조를 사용하십시오. 네가 반쯤 질문을 올렸을 때 편집을 썼다. array라는 이름의 변수를 보았을 때 나는 당신에게 전달 된 것을 사용하는 대신 array의 새로운 인스턴스를 가질 수 있다고 생각했다 : –

+0

self.array = fruits는 array의 새로운 인스턴스를 생성하지 않고, 오히려 동일한 배열에 대한 포인터를 생성한다. self.array = [String]()은 제안 된 솔루션에서 작동하지 않는 새로운 인스턴스를 만듭니다. 당신이 지금하고있는 일은 잘 작동해야합니다 :) –

관련 문제