본문 바로가기

iOS/니카내카

[니카내카] 업데이트 사항 (version 1.2.2)

728x90

조금씩 업데이트를 하고 있는데 .. 티스토리에 글을 너무 안쓴 것 같아 .. 적어보는 중 .. 

후 .. 미루지 말자 .. !

 

코드 개선 

Diffable Data Source, Compostional Layout 적용

설정 화면과 주차장 상세 화면을 새로운 CollectionView API로 코드개선, 적용해보았다. 

 

흐름만 잘 잡고 있으면 생각보다 쉽지만 .. 아무래도 이전 방식이 더 익숙하다 보니까 ... 좀 더 유연하고 자유롭게 쓰기엔 아직은 어색하다고 느꼈다 .. 

 

아직 아래 두가지가 조금 어려운? 익숙하지 않은? 느낌인데 .. 좀 더 공부하고 정리해봐야겠다 .. !

 

🔥 Compositional Layout은 item, group으로 레이아웃을 잡는데 이것들의 관계 .. 그리고 좀 더 다양한 레이아웃을 어떻게 대응할 수 있을지?

🔥 Diffable DataSource에서 Header의 refresh는 어떻게 할 수 있는가 .. ! (이 부분을 해결하지 못해서 일단 reloadData로 했는데 .. 분명 이것이 아닐텐데 ... 좀 더 고민해보자 ~~)

 

 

[weak self]

싹에서 매주 금요일마다 위클리 컨벤션을 하는데,

희철님의 발표를 듣고 .. 오 .. 내 앱이 제법 .. 터지겠군 .. 이라는 생각에 온보딩 화면부터 하나씩 뜯어보면서 .. 수정하고 있다 ..

 

ARC 관련된 .. 이슈인데 .. 자세한 내용은 정리해서 다시 올리는 것으로 .. ! 꼭 !!

 

 

이거 수정하면서 무슨 말벌 아저씨마냥 .. 뭐? self? 이러면서 수정했다 ..

저놈의 self가 내 앱을 해치려고 ..

생각보다 캡처 리스트 self를 많이 사용하고 있었다는 것을 알 수 있었다 ..

이번에 Rx를 배우면서 되게 조심해야겠다고 느꼈기 때문에 .. (dispose 관련해서) 앞으로 캡처 리스트 안에서 self를 사용할 때는 습관적으로 약한 참조로 바꿔서 작성하도록 해야겠다 .. 

 


위에서 말한 Diffable HeaderView 관련 이슈가 무엇이냐면 .. (아직 미해결 .. 구현은 되지만 ..)

 

니카내카 앱의 설정 화면은 아래와 같다.

 

이 때, 상단의 닉네임과 내 정보 수정하기 부분은 헤더 뷰로 설정했다.

 

기존의 코드에서는 (CollectionViewDataSource + FlowLayout) ViewWillAppear 그리고 화면 전환 이후의 클로저 구문에서 reloadData로 UserDefaults에 저장된 닉네임을 불 헤더뷰의 UI/데이터를 수정했다.

 

그러나, Diffable DataSource를 사용하게 되면 순서의 흐름이 중요한데, viewWillAppear에서 DataSource의 snapshot에 접근하게 되면 틀이 만들어지지 않았는데 안의 데이터를 관리하려고 하므로 에러가 발생한다. 

 

그래서 .. 마찬가지로 화면 전환 이후의 클로저 구문에서 컬렉션 뷰를 갱신하고 싶었는데 ..

snapshot을 통해서 하려고 했지만 .. 제대로 동작되지 않았다 .. 아직 문제가 무엇인지 몰라서 .. (아마도 스냅샷에서 새로 갱신하고 있는 부분이 셀에 들어갈 데이터를 관리할 뿐, 헤더의 데이터는 관리하지 않아서 생기는 문제라고 추측하고 있다 ..) 

일단은 .. 화면 전환 이후 클로저 구문에 reloadData를 호출해서 헤더뷰까지의 데이터를 갱신했다. 

 

 

뷰안에서의 인터렉션이므로 delegate pattern을 사용해서 이벤트 처리를 했다. 

extension SettingViewController: SettingHeaderViewDelegate {
    func touchUpButton() {
        let viewController = SettingNameController()
        viewController.closure = { [weak self] name in
            guard let self = self else { return }
            
            print(name)
            self.collectionView.reloadData()
        }
        transition(viewController, transitionStyle: .presentFullScreen)
    }
}

요렇게 ..

 

근데 .. 음 .. 저렇게 말고 DiffableDataSource의 속성 중에 있을 것이라 .. 생각 ..

찾아보겠습니다 ~ ...