2014-10-02 2 views
2

이 코드는 HTTP 요청 내에서 콜백 함수 내부에서 호출합니다. http 요청은 앱 데이터를 업데이트하는 데 사용되는 get입니다. 따라서 일부 VC의 경우 콜백이 수행 된 뷰를 다시로드해야합니다. 콜백은 코어 데이터의 모든 내용을 업데이트합니다.Reload 비동기 함수에서 UITable 호출

여기는 현재 콜백 함수 내부에서 호출되는 코드 조각입니다.

func reloadTopMost(){ 
    var topMost = topMostContoller() as UIViewController 
    if topMost.isKindOfClass(SecondViewController){ 
     topMost.reloadInputViews() 

     var svc = topMost as SecondViewController 
     svc.studentTable.reloadData() 
     svc.studentTable.setNeedsDisplay() 
     svc.viewDidLoad() 
     svc.reloadInputViews() 
    }else if topMost.isKindOfClass(ThirdViewController){ 
     topMost.reloadInputViews() 

     var tvc = topMost as ThirdViewController 
     tvc.inClassTable.reloadData() 
     tvc.inClassTable.setNeedsDisplay() 
     tvc.viewDidLoad() 
     tvc.reloadInputViews() 
    } 
} 

당신이 볼 수 있듯이 나는 시도 reloadData(), setNeedsDisplay()의 viewDidLoad 및 reloadInputViews(). this과 같은 질문에 대한 답변에서 얻은 아이디어. 나는 if 문이 각각의 vc 클래스에 전달된다는 것을 확신합니다. 그래서 이것이 VC/테이블을 다시로드하지 않는 이유를 모르겠습니다. 이것은 비동기 함수에서 호출 되었기 때문입니까?

답변

5

비동기 함수에서 호출 되었기 때문입니까?

아마도 문제 일 수 있습니다. 콜백이 백그라운드 스레드에서 호출 될 가능성이 있습니다. UIKit은 스레드로부터 안전하지 않으며 관련된 모든 것이 주 스레드에서 실행되어야합니다. 주 스레드에서 reloadTopMost()이 실행되도록 설정하면 문제가 해결됩니다. 당신은 그렇게 dispatch_async()를 사용할 수 있습니다

// In your callback: 
dispatch_async(dispatch_get_main_queue(), { 
    self.reloadTopMost() 
}) 

바로 그 dispatch_async() 수익을 유의하시기 바랍니다. 재로드가 완료 될 때까지 기다릴 필요가 있다면 dispatch_sync()을 사용할 수 있습니다.