개발/Swift
-
Compositional Layout + Diffable DataSource - 2 헤더 추가하기개발/Swift 2022. 11. 27. 15:35
헤더 추가하기 우선 새로운 타입 sqaure carousel 섹션을 추가했다. 여기서는 새로운 타입의 아이템을 넣어줬다. enum Item: Hashable { case banner(HomeItem) case normalCarousel(HomeItem) case squareCarousel(RestaurantItem) } struct RestaurantItem: Hashable { let name: String let reviewPoint: Float let reviewCount: Int let imageUrl: String } 이러면 데이터소스에 넣어줄때 RestaurantItem 타입을 넣어주고 cell 그릴때 RestaurantItem 타입의 데이터를 받아 사용할수 있다. //스냅샷 부분 snapsh..
-
[Swift] Compositional Layout - DiffableDataSource 와 함께 사용개발/Swift 2022. 11. 23. 17:00
Modern Collection View 와 MVVM 패턴 가이드 [iOS] Swift Modern Collection View & MVVM 패턴 가이드 강의 - 인프런 MVVM 패턴과 Modern Collection View를 사용해 네트워킹을 구현하고, 다양하고 동적인 Collection View를 자유자재로 다룰 수 있게 됩니다., Swift iOS UI, 제대로 다루는 핵심 기술! 📲 iOS Swift 레이아웃 구현을 www.inflearn.com 기존 datasource 구조에서 data controller 와 UI 가 상호작용하면 서 collectionview가 구성되는데 시간이 지남에따라 외부적인 변동으로 인해 controller가 가진 “Truth”와 UI가 가진 “Truth”가 맞지 않게..
-
[Swift] Compositional Layout - 헤더, 다양한 layout적용개발/Swift 2022. 11. 23. 15:16
Modern Collection View 와 MVVM 패턴 가이드 [iOS] Swift Modern Collection View & MVVM 패턴 가이드 강의 - 인프런 MVVM 패턴과 Modern Collection View를 사용해 네트워킹을 구현하고, 다양하고 동적인 Collection View를 자유자재로 다룰 수 있게 됩니다., Swift iOS UI, 제대로 다루는 핵심 기술! 📲 iOS Swift 레이아웃 구현을 www.inflearn.com 헤더 추가하기 헤더를 추가하기 위해 다음작업들이 필요하다 헤더 구현( UICollectionReusableView ) 헤더 레지스터 헤더를 데이터소스에 추가 헤더를 레이아웃에 추가 헤더를 레지스터하는 방법은 cell레지스터와 비슷하다 collection..
-
[Swift] Compositional Layout - 레이아웃 그려보기개발/Swift 2022. 11. 22. 16:45
Modern Collection View 와 MVVM 패턴 가이드 다양한 사이즈 형태의 collection view를 구현 하기 위해 Group을 잘 짜줘야 한다. let group = NSCollectionLayoutGroup.vertical( layoutSize: NSCollectionLayoutSize( widthDimension: .fractionalWidth(1.0), heightDimension: .fractionalWidth(16/9)), subitems: [다양한 그룹들]) (각 그룹들의 높이는 고정값으로 지정했으니 무시) 위 그룹의 subItems 안에 다양한 타입의 그룹이 들어갈것이고 해당 그룹들은 vertical 하게 들어갈것이다. 다음 예시를 통해 여러 타입의 collectionvi..
-
Closure 의 Capture 와 Self개발/Swift 2022. 11. 21. 15:58
var a = 0 var b = 0 let closure = { print(a,b) } a = 5 closure() 위와같은 상황에 클로져가 호출될때 a가 직전에 5로 변경되었으므로 5 0 이 호출 된다. 이게 클로져의 기본동작이다. 원본값이(a) 변하면 클로져 내부값도 변하는 “Reference capture”를 한다. var a = 0 var b = 0 let closure = { [a] in print(a,b) } a = 5 closure() 위 클로져에서는 [a] in 을 넣어줬다. 이때 결과값은 0 0 이 된다. 클로져를 "생성" 할때 변수 a 를 a라는 상수로 capture한다. (따라서 변경 불가) 위와 같은 [a] 이런것을 Capture List라 한다. 따라서 클로져 내부에서 Captur..
-
DispatchQueue 에서 주의할 데드락 현상개발/Swift 2022. 11. 21. 13:39
멀티스레딩을 사용할경우 Dispatch Queue를 사용해 main 혹은 global 큐를 통해 스레드를 지정해 작업을 하게된다. 이때 사용에 유의 해야할 점들이있다. DispatchQueue.main.sync (데드락100) UI작업은 메인스레드에서 작업하게 된다. 현재 상황이 메인스레드라면 이 안에서 main.sync를 사용하면 안된다. //Main스레드 DispatchQueue.main.sync{ // 작업 } 메인큐로 작업을 보냄 작업이 끝날때 까지 메인스레드 대기 - sync 보내진 작업이 메인스레드로 전달 (대기중인데 전달됨) 데드락 스레드가 대기중인 상황에서 작업이 또 온다? - 데드락 메인스레드 상황 내가 대기하고 있던 작업이 끝날때까지 계속 기다리는중 또 다른 작업이 뒤에 와도 내 현재 ..
-
Rxswift - ObserveOn , SubscribeOn개발/Swift 2022. 11. 18. 16:03
Observable의 쓰레드를 변경시키는 두가지방법이 있다. 일반적으로 별도의 설정 없이는 “구독한 시점에서의 쓰레드” 를 사용한다. //Main Thread에서 productList Observable 생성 output.productList .bind(to: productListTableView.rx.items(cellIdentifier: "ProductListCell", cellType: ProductListTableViewCell.self)) {[weak self] (_, element, cell) in print("Thread.isMainThread \\(Thread.isMainThread)") //→ 메인스레드 true cell.configure(id: element.id, nameKo: ele..
-
Rxswift 에러 핸들링 (complete, dispose 대응)개발/Swift 2022. 11. 18. 14:19
네트워크 통신 에러 핸들링에서 필요한 요구사항은 이러하다 에러 발생시 Viewcontroller 에서 인지하고 알맞은 에러메시지를 띄운다. 에러가 발생해도 원하는 때에 다시 재시도 할수 있어야 한다. Rx 에서 에러가 발생하면 observable 체인은 dispose되고 이후에 성공이 발생하도 동작 하지 않는다. 일반적인 해결법은 catch가 있으나 catch 또한 complete 로 이벤트가 종료된다. //VM let productList = PublishSubject() productList.onError(error) productList.onNext(data) ///VC output.productList .catch({ error in self.present(Dialog.getDialog(title..