2017-11-22 3 views
1

SVProgressHUD를 사용하여 응용 프로그램이 사용 중임을 나타냅니다.SVProgressHUD는 UITableView가 표시 될 때까지 표시되지 않습니다.

내 코드는 지금 :

 SVProgressHUD.show() 
     DispatchQueue.global(qos: .background).async { 
      parser.parse() 
      print("start reloading") 
      self.protocolTableView.reloadData() 

      print("end reloading") 
      SVProgressHUD.dismiss() 
     } 

나는이 경고를 얻을 :

UITableView.reloadData() must be used from main thread only 

을 그리고 분석이 완료 된 후있는 tableView가 표시되기 전에 꽤 시간이 걸립니다.

주 스레드에서 구문 분석을 읽은 후 tableView를 업데이트하려면 어떻게해야합니까?

덕분 바트

+0

이 작동합니다 확실하지 않음 경우, 그러나 당신은 prepareForSegue 방법에 쇼() 메소드를 넣어 시도 할 수 있습니다? 또는 주 스레드에서 show() 호출을 실행 해 볼 수 있다고 생각합니다. – Skywalker

+0

prepareForSegue()로 이동하도록 코드를 업데이트했지만 viewDidLoad()가 완료 될 때까지 메인 스레드에서만 실행되는 것 같습니다 . –

+0

'SVProgressHUD.show()'는 이미 주 큐에 자신을 추가합니다. 명시 적으로 다시 할 필요가 없습니다. –

답변

1

XMLParser.parse은 UI를 차단할 수있다. 백그라운드 스레드에서 그 일을보십시오 : 메인 스레드에서

DispatchQueue.global(qos: .background).async { 
    parser.parse() 
} 
0
DispatchQueue.main.async { 
     self.protocolTableView.reloadData() 
     } 

새로 고침있는 tableView.

+0

DispatchQueue.main.async 대신 DispatchQueue.main.sync를 사용할 때 제대로 작동했습니다. –

+0

Welldone !!! 적어도 해결되었습니다. –

0

이 솔루션했다 : 모든 도움

SVProgressHUD.show() 
DispatchQueue.global(qos: .background).async { 
    parser.parse() 

    DispatchQueue.main.sync { 
     self.protocolTableView.reloadData() 
    } 

    SVProgressHUD.dismiss() 
} 

감사합니다!

0

UI 업데이트는 메인 스레드에서 수행해야합니다

SVProgressHUD.show() 
DispatchQueue.global(qos: .background).async { 
    parser.parse() 
    print("start reloading") 

    DispatchQueue.main.async(execute: {() -> Void in 
     self.protocolTableView.reloadData() 
     SVProgressHUD.dismiss() 
    }) 
} 
관련 문제