Fezravien / re-ios-open-market

REST API 연동을 통한 상품 목록 조회, 상세 조회, 등록, 수정, 삭제 기능을 가진 앱
3 stars 0 forks source link

상품 등록 후 메인 페이지를 통해 상세 페이지로 등록된 상품 보여주기 오류 #18

Open Fezravien opened 3 years ago

Fezravien commented 3 years ago

상품 등록 후 메인 페이지를 통해 상세 페이지로 등록된 상품 보여주기

델리게이트 패턴을 통해 등록 페이지에서 메인 페이지로 등록이 완료되면 데이터를 전달 받도록 구현 하지만, 상세페이지에는 아무것도 나타나지 않았음 ...

breakPoint를 걸어서 스텝별로 살펴보니.

ViewModelView가 Data binding 되어 있는 구조인데, 상세 페이지가 뜨기 전에 모델을 미리 변경시키는 현상이 발견됨 그러므로 UI는 업데이트 되지 않고 백색 화면으로 보임


상세 페이지가 뜨기 전에 모델을 변경시켜서 UI가 업데이트 안되는 상황으로 보여 DispatchQueue.main.asyncAfter 으로 0.5 초의 딜레이를 추가함

    func displayRegisteratedItem(item: Item) {
        self.marketDetailViewController = MarketDetailViewController()
        self.navigationController?.pushViewController(self.marketDetailViewController ?? MarketDetailViewController(), animated: true)
        DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
            self.marketDetailViewController?.refreshDetailItem(item: item)
        }
    }

보이는 바와 같이 이미지만 업데이트 되고, text는 업데이트 되지 못하는 상황이 벌어짐

DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
            self.marketDetailViewController?.refreshDetailItem(item: item)
        }

딜레이를 1초로 증가시키게 되면 정상적으로 작동하는 것을 볼 수 있다.

Fezravien commented 3 years ago
func displayRegisteratedItem(item: Item) {
    self.marketDetailViewController = MarketDetailViewController()
    self.navigationController?.pushViewController(self.marketDetailViewController, animated: true)

    DispatchQueue.main.asyncAfter(deadline: .now() + 2) { [unowned self] in
        self.itemListCollectionView.reloadData()
        self.marketDetailViewController?.refreshDetailItem(item: item)
    }
}

문제를 딜레이을 줌으로써 해결을 했었다.

이 딜레이에는 이미지URL 다운로드 + View push, pop에 따른 딜레이였다. (View가 push된 이후에 데이터 전달해야 ViewModel의 클로저 시점이 맞음)

하지만 이 딜레이가 기기에 따라 0.5초에 동작하기도 하고, 1초에 동작하기도 한다. 즉, 기기와 환경에 따라 오류가 발생할 수 있다는 의미다.

디버깅을 해보면 ViewController의 viewDidLoad가 호출되기도 전에 데이터를 업데이트하는 현상이 발견되었다. 그래서 데이터를 바로 업데이트 시켜주기 위해 ViewModel로 보내는 것이 아닌, 데이터를 프로퍼티로 저장하고 있다가 viewDidLoad가 호출될 때 프로퍼티를 확인하여 값이 존재하면 ViewModel로 업데이트 시켜주는 방식으로 수정했다.

또한, 사용자 경험을 고려하여 상품 목록에서 상품 상세로 보여주는 방식에서 바로 상품 상세로 바로 넘어가도록 수정했고, 뒤로 이벤트를 .popToRootViewController 활용하여 바로 상품 목록으로 이동하도록 했다.