분류 전체보기

    [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로 접근해서 그런것이다 바보같이 그..

    [iOS] - 키체인(Key Chain)

    키체인 키체인을 학습하게된 이유는 OAuth를 통해 소셜로그인을 하고 toke을 받게된다. 이를 저장, 활용하려 하지만, 유저디폴트에 저장하기엔 민감한 정보라 키체인을 학습하게 되었다. UserDefault와 다른점? UserDefault에도 데이터를 쉽게 저장할 수 있지만 단순히 .info파일에 키-값 쌍의 텍스트 형태로 저장하게된다. 그렇기 때문에 OS를 탈옥하면 내용물을 볼 수 있기 때문에 보안이 필요한 민감한 데이터를 저장하기에는 보안이슈등 어울리지 않는다. 이를 방지하기 위해 암호, APIToken, 알고리즘을 위한 value등은 KeyChain에 저장하는 것이 좋다. 그렇다면 KeyChain이란 무엇일까? 암호화된 데이터베이스, 즉 데이터를 안전하게 저장할 수 있는 보관소이다. KeyChain..

    [코딩테스트] - 격자판 회문수(Swift)

    격자판 회문수 1부터 9까지의 자연수로 채워진 7*7 격자판이 주어지면 격자판 위에서 가로방향 또는 세로방향으로 길이 5자리 회문수가 몇 개 있는지 구하는 프로그램을 작성하세요. 회문수란 121과 같이 앞에서부터 읽으나 뒤에서부터 읽으나 같은 수를 말합니다. 빨간색처럼 구부러진 경우(87178)는 회문수로 간주하지 않습니다. ▣ 입력설명 1부터 9까지의 자연수로 채워진 7*7격자판이 주어집니다. ▣ 출력설명 5자리 회문수의 개수를 출력합니다. ▣ 입력예제 1 2 4 1 5 3 2 6 3 5 1 8 7 1 7 8 3 2 7 1 3 8 6 1 2 3 2 1 1 1 3 1 3 5 3 2 1 1 2 5 6 5 2 1 2 2 2 2 1 5 ▣ 출력예제 1 3 풀이 및 소스코드 var grid = [[Int]]()..

    OAuth 2.0의 개념과 동작원

    웹 서핑, 앱을 사용하다 보면 Google과 Facebook, Twitter, github등 외부 소셜 계정을 기반으로 회원가입 및 로그인할 수 있는 어플리케이션을 쉽게 찾아볼 수 있다. 편리하게 회원가입, 로그인을 할 수 있을 뿐 아니라 연동되는 외부 어플리케이션에서 Facebook, Twitter등이 제공하는 기능을 간편하게 사용할 수 있다는 장점이 있다. 예를 들어 외부 어플리케이션에 Google로 로그인하면 API를 통해 연동된 계정의 Google Calendar 정보를 가져와 사용자에게 보여줄 수 있다. 이 때 사용되는 프로토콜이 OAuth이다. OAuth란? OAuth는 인터넷 사용자들이 비밀번호를 제공하지 않고 다른 웹사이트상의 자신들의 정보에 대해 어플리케이션의 접근 권한을 부여할 수 있는..

    [네트워크] HTTP protocol - 쿠키와 세션(Cookies and Session)

    HTTP의 특징과 쿠키, 세션을 사용하는 이유 서버가 클라이언트와 통신할 때, 서버는 클라이언트가 누구인지 계속 인증해야한다. 왜냐하면 HTTP프로토콜이 Connectionless, Stateless한 특성이 있기 때문이다. Connectionless: 비연결성 - 연결을 유지하지 않는다. Stateless: 무상태성 - 상태를 유지하지 않는다. Stateless란 상태가 없다는 의미이다. HTTP에서 stateless하다는 건 서버 입장에서 클라이언트의 상태가 없다는 의미로 동일한 클라이언트의 요청이라도 매번 각 요청은 독립적이라는 의미이다. 예를들어 놀이공원(서버)에 손님이 입장(요청)했다가, 퇴장(응답)했을 때 손님 한명 한명 다 기억할 수 없다. 그렇기 때문에 놀이공원에서는 재입장하는 손님을 구분..

    [Firebase] Authentication Rest API(OAuth)

    Firebase Authentication Authentication(인증)? 앱, 웹에 모든 사용자가 모든 컨텐츠에 접근할 수 있어야 하는것은 아니다. 이런 접근에 대한 권한을 "인증(Authentication)"을 통해 보호할 수 있다. 페이지 뿐만 아닌 데이터베이스에 저장된 데이터, 앱의 기능들을 인증을 통해 권한을 제어하고 데이터를 보호할 수 있다. 인증이 된 사용자만이 어떤 기능을 이용할 수 있고, 사용자 인증을 통해 데이터를 조작할 수 있게끔 한다던지.. 즉, 서버는 클라이언트에게 전달받은 요청에 따라서 인증 받은 사용자인지 검사를 하고, 인증받은 사용자에게만 요청에 대한 응답을 클라이언트에게 전달할 수 있어야 한다. 이런 인증의 방법으로는 "로그인"이 있다. 로그인을 위한 버튼을 누르면 정보..

    RxSwift를 이용한 method 호출 구독

    RxSwift에서 swizzling을 통해 특정 메서드의 호출 전, 후에 대한 이벤트를 구독할 수 있다. public func sentMessage(_ selector: Selector) -> Observable public func methodInvoked(_ selector: Selector) -> Observable sentMessage: 메서드가 호출되기 전 methodInvoked: 메서드가 호출된 후에 실행 extension Reactive where Base: UIViewController{ var viewDidLoad: ControlEvent { let source = self.methodInvoked(#selector(Base.viewDidLoad)).map { _ in } return ..