2017-02-22 4 views
1

나는 tableview 데이터 소스를 빈번하게 업데이트하려고하며, datview 업데이트와 테이블 뷰 업데이트를 올바르게 동기화해야합니다. 스위프트 3에서 이에 대한 올바른 접근법을 제안 할 수 있습니까?데이터 소스 업데이트를 threadview 안전과 함께 tableview reload와 동기화하는 방법은 무엇입니까?

()이 코드 tableView.reloadData에서

func refreshForUpdates() { 

    DispatchQueue.main.async { 

     self.updateApprovalListBackgroundGraphics() 

     self.tableView.reloadData() 

     Log.debug("refresh cards Reloaded") 
    } 
} 

/// Main list viewmodel refreshing and filtering API 
private func refreshCards(withIcon icon: CardIcon) { 

    queue.async { 

     Log.debug("refresh cards Started") 

     switch icon { 

     case .all: 

      self.loadOpenCards() 
      self.loadCompletedCards() 

     default: 

      self.filterOpenCards(byIcon: icon) 
      self.filterCompletedCards(byIcon: icon) 
     } 

     // Ask list TVC to reload table 
     self.listTVC?.refreshForUpdates() 

     Log.debug("refresh cards Finished") 
    } 
} 

ListTableViewController ListViewModel가 주 스레드에서 비동기 파견되어 있기 때문에 뷰 모델 새로 고침을 기다리지 않습니다.

+0

언제 refreshForUpdates()를 호출합니까 ?? –

+0

모델이보기 컨트롤러에 대해 알고있는 이유는 무엇입니까? 그것은 거꾸로입니다. – rmaddy

+0

@Tushar Shama : 행 뒤의 뷰 모델에서 TVC가 테이블을 다시로드하기 위해 TVC를 호출합니다. –

답변

1

이런 경우에 일반적으로 취하는 접근법은 뷰 컨트롤러가 데이터의 정적 복사본을 가지고 백그라운드에서 아무 것도 변경되지 않도록하는 것입니다.

데이터 모델의 마스터 인스턴스가 있습니다. 이 데이터 모델은 비동기 업데이트를 처리합니다. 필요한 것은 뷰어 컨트롤러와 같은 청취자에게 업데이트되었음을 ​​알리는 것입니다. 리스너는 데이터 모델의 복사본을 저장하고 뷰를 새로 고침 (예 : 테이블 뷰 다시로드)하여이 업데이트에 응답해야합니다.

뷰 컨트롤러가 자체적으로 업데이트되는 동안 마스터 데이터 모델이 다른 업데이트를 게시하는 경우 이전 컨트롤러 업데이트 및 뷰 컨트롤러의 복사본에서 업데이트가 완료 될 때까지 뷰 컨트롤러가 다음 업데이트를 처리하지 않으므로 문제가되지 않습니다. 데이터의 새 업데이트가 아직 업데이트되지 않았습니다.

+0

실제로 '복사'접근법도 생각하고있었습니다. 하지만 VC와 viewmodel 사이의 간단한 동기화 작업을 위해 추가 작업이 필요했습니다. 하지만 더 좋은 제안이 없다면 지금 시도 할 것입니다. 감사합니다. –

+0

보기 컨트롤러는보기가 데이터와 동기화되도록 데이터의 안정된 복사본이 필요합니다. 보기가 업데이트되는 동안 데이터가 변경 될 수있는 경우 문제가 발생합니다 (예 : 충돌). 마스터 데이터가 정기적으로 비동기 적으로 업데이트되는 경우 복사본을 만드는 것 외에 다른 방법은 없습니다. – rmaddy

+0

나는 지금 동의하고 그것을 시도 할 것이다. 큐를 사용하는 또 다른 가능한 접근법을 실제로 생각하고있었습니다. 모델 업데이트 요청을 직렬 큐에 넣고 tableview reload와 동 기적으로 하나씩 실행합니다.이는 기본 스레드에서 tableview reload를 포함하여 이전 작업이 완료 될 때만 다음 모델 업데이트 새로 고침을 시작하는 것을 의미합니다. 내가 사용하고있는 NSOperation 또는 ProcedureKit을 사용하여이 작업을 수행하는 방법을 알고 있지만 Swift 3에서 직접 Dispatch (GDC) API를 사용하여 수행하는 방법을 정확히 알지 못했습니다. NSOperation/Procedure를 호출하여 tableview를 다시로드하면 완료됩니다. . –