전체 글
[iOS] Modul
모듈 프로그램의 기능을 독립적으로 분리한 것을 모듈이라고 한다(Naver) 쉽게 특정 기능별로 나누어진 프로그램 덩어리 수 많은 코드를 짠다고 할 때 모든 코드를 1개의 파일에 작성할 경우 몇만줄의 코드를 일일히 읽기란 본인이 작성한 코드여도 힘들며, 다른 개발자가 작성했다면 더욱 힘들것이다. 그로인해 유지보수성과 재사용성이 매우 감소한다. 이를 방지하기위해 효율적이고 재사용 가능하도록 코드를 작성하려고 개발자는 노력해야한다. 이때 유용한게 모듈화이다. 모듈화가 잘 되어있다면 내가 아니라 다른사람이 내가 만들어 놓은 기능을 필요로 할 때에도 사용될 수 있다. 즉, 다른 프로그램의 부품으로도 사용이 가능해진다. 모듈화의 장점 1. 빌드 속도 감소. XCode는 빌드시 빌드 결과를 폴더에 저장해놓고 해당 폴..
POP와 OOP의 차이
프로토콜지향 프로그래밍 POP(Protocol Oriented Programming) 프로토콜 중심의 프로그래밍으로 확장을 통한 수평 구조로 타입을 확장하는 방식으로 다형성을 구현한다 프로토콜에 정의된 인터페이스를 직접 구현하기 때문에 필요치 않은 프로퍼티나 메서드를 구현하지 않을 수 있다. 참조, 값타입을 모두 지원하며 상속의 경우 하나의 슈퍼클래스를 상속할 수 있지만 프로토콜의 경우 다양한 프로토콜을 채택할 수 있다. 객체지향 프로그래밍 OOP(Obeject Oriented Programming) 객체 중심 프로그래밍으로서 슈퍼클래스의 상속을 통하여 수직구조로 타입을 확장하는 방식의 다형성 구현한다. 객체 지향적으로 아래에서 부터 위로 접근하는 상향식 접근 구조이다. 함수나 생성자, 연산자를 오버로드..
Singleton 패턴을 활용하는 경우
Singleton 싱글톤 패턴은 특정 용도의 객체를 하나 생성해서 여러 상황에 공용으로 사용하고 싶을 때 사용하는 방법이다. 인스턴스가 하나만 존재하는 것을 보장하게되며, 주로 환경설정, 네트워크객체, 로그인 정보 등을 특정 용도로 생성해둔 객체에 넣어두고 필요할 때 접근한다. 인스턴스가 하나만 존재하는것을 보장하므로 메모리 낭비를 방지할 수 있고 데이터를 공유할 수 있다는 장점이 있다. class Singleton { static let shared = Singleton() let value = 3 private init(){} } Singleton.shared.value static을 활용해 인스턴스를 저장할 타입 프로퍼티를 생성. init을 호출해 또 다른 인스턴스를 생성하는것을 막는다. 메모리가 ..
[iOS - UIKit] StackView를 알아보자
https://developer.apple.com/documentation/uikit/uistackview UIStackView | Apple Developer Documentation A streamlined interface for laying out a collection of views in either a column or a row. developer.apple.com UI StackView + 애플 개발자문서. 행 또는 열에 View들의 묶음을 배치할 수 있는 간소화된 인터페이스이다. 공식 문서의 설명 [개요] StackView는 AutoLayout의 힘을 활용하여 사용자 인터페이스를 작성할 수 있게 해주며, 기기의 방향, 화면의 크기, 사용가능한 공간의 변경에 동적으로 적을할 수 있는 인터..
[RxSwift] CollectionView또는 TableView 셀의 UIImageView or UIButton 클릭 이벤트 처리
UITableViewCell의 ImageView 클릭이벤트 처리 Cell에서 ImageView의 탭제스처 감지 후 옵저버블로 방출 ViewController에서는 옵저버블 구독 후, ViewModel로 전달 ViewModel은 이벤트를 받아 처리하고, 필요한 데이터 업데이트 수행 방법 1. ViewController에서 바로 ViewModel로 전달 Cell import UIKit import RxSwift import RxCocoa class MyTableViewCell: UITableViewCell { @IBOutlet weak var myImageView: UIImageView! private var disposeBag = DisposeBag() private var indexPath: IndexP..
[iOS] Moya(Network)
https://github.com/Moya/Moya GitHub - Moya/Moya: Network abstraction layer written in Swift. Network abstraction layer written in Swift. Contribute to Moya/Moya development by creating an account on GitHub. github.com Networking은 앱에서 거의 필수적인 요소다. Networking을 위해 개발자는 흔히 APIManager 또는 NetworkModel로 불리는 네트워크 모듈을 설계한다. 이런 상황에 API추가가 쉽고 변경이 용이한 네트워크 모듈을 개발하는것은 중요하다. 네트워크 통신을 위해 URLSession을 사용할 수 있다. ..
[RxSwift] throttle, debounce
throttle( x, latest = true) 주로 버튼의 중복 입력 방지에 사용된다. latest 의 기본값은 true이다. 코드 let input = EditProfileViewModel.Input( imageViewButtonTapped: profileImageView.button.rx.tap .throttle(.seconds(10), scheduler: MainScheduler.asyncInstance), 이렇게 설정하게 되면 Input으로 첫 Event가 발생하면 Event를 방출하고 10초동안 무시한 뒤 10초가 지나면 가장 마지막이벤트를 전달한다. 물론 1개의 이벤트만 발생했다면 최초 1개의 이벤트만 방출한다. let input = EditProfileViewModel.Input( set..
[Clean Architecture] Repository Pattern in IOS
Repository Pattern Repository Pattern의 필요성 Repository Pattern을 사용하지 않은 앱은 VC or MV이 직접 데이터들을 가지게 된다. 이에 따라오는 문제가 무엇일까? 바로 유지보수이다. 앱이 커지고 화면이 많아져서 개발자가 늘어난다면?? 만약 로컬DB에 저장하기 위해 CoreData를 사용하다가 realm으로 갈아타던지(NSManagedObject이 붙은 자료들), API, JSON등 Networking의 예시로 Codable을 채택해서 만든 객체를 앱 전역에서 사용중인데 서버에서 API에 내려주는 구조가 바뀐다면..? ViewModel의 객체들을 하나 하나 전부 수정해야한다. 만약 다음과 같은 이름과 몸무게를 포함하는 구조체를 사용하고 있다고 하자. str..
[RxSwift] RxDataSource로 CollectionView 사용하기
RxDataSource RxDataSource를 활용해 CollectionView를 사용하는 방법을 정리해보려고 한다. RxDataSource가 필요한 이유 일반적인 상황에선 DataSource를 사용해 데이터를 표현하지만 Rx를 사용할 경우 아래와 메서드를 활용한다. collectionView.rx.items(cellIdentifier: ) collectionView.rx.items(source: ) collectionView.rx.items(dataSource: RxCollectionViewDataSourceType & UICollectionViewDataSource) 이런 메서드를 통해 아래와 같은 방법으로 RxCocoa를 활용해 데이터를 표현한다. let data = Observable.just(..
[Swift] (ViewController) -> () -> ViewController 에러?? 초기화 전 self접근
RxDataSource를 사용하던 중 처음보는 오류를 만났다. private let dataSource = RxCollectionViewSectionedReloadDataSource(configureCell: { [weak self] (datasource, collectionView, indexPath, item) in guard let self = self else { return UICollectionViewCell() } [weak self]로 캡처한 self가 ViewController가 아닌 (ViewController) -> () -> ViewController 타입의 클로저가 되는것.. 원인은 ViewController(클래스) 가 초기화되기 이전에 self로 접근해서 그런것이다 바보같이 그..