ios

    [RxSwift] RxSwift 톺아보기 - 2

    RxSwift를 사용하면서 공부한 내용을 정리한 글입니다. 1. Disposing 1) 개요 Disposable 타입의 dispose() 메서드를 통해 원하는 시기에 Observable Sequence를 종료하고 메모리에 할당된 subscription 리소스를 해제할 수 있다. 그러나 dispose() 메서드를 수동으로 호출하는 것은 좋은 방법이 아니며 DisposeBag 클래스를 사용해 리소스를 정리하는 방법이 있다. 일반적인 Observable Sequence는 completed 또는 error 이벤트를 방출하여 정상적으로 종료됐을 때 메모리에서 해제된다. 하지만 버튼 탭 처럼 자연스럽게 종료되지 않는 Sequence의 경우 직접 리소스를 정리해줘야한다. 2) DisposeBag DisposeBag은..

    [RxSwift] RxSwift 톺아보기 - 1

    RxSwift를 써보면서 공부했던 내용을 간략하게 정리한 글입니다. 1. 소개 1) 왜 RxSwift를 사용하는가? 우리가 앱을 만들기 위해 작성하는 대부분의 코드는 외부 이벤트(UI 컨트롤 등)에 대한 응답을 다룬다. 예를 들어 버튼 터치에 대한 액션 메서드를 작성하거나 기기의 방향 변경에 대한 옵저버를 추가해서 특정 작업을 수행하는 코드를 작성한다. 뿐만 아니라 네트워크 통신으로 받은 응답을 처리하기 위해 클로저 구문을 작성하기도 한다. RxSwift는 이러한 모든 비동기적인 응답 코드들을 처리하는 일관된 시스템이다. 2) 개념 모든 Observable 객체는 Sequence의 인스턴스로 간주된다. Sequence 순차적, 반복적으로 자신의 원소에 접근할 수 있는 타입을 의미하며, for-each 같..

    [IOS] UIGestureRecognizer 사용해서 지도 조작하기

    출시 프로젝트에서 사용한 네이버 지도는 기본적인 제스처가 설정돼있다. 일반적으로 Pan 제스처는 카메라를 상하좌우로 이동시키고, Pinch 제스처는 카메라의 확대 축소를 담당한다. 그런데 사용자 주변의 특정 장소를 찾는다는 앱의 특성 상 사용자의 위치를 중심으로 지도의 카메라가 움직이는 새로운 조작법을 만들고 싶었다. 이 글은 게임 포켓몬고의 제스쳐 액션을 UIGestureRecognizer를 통해 구현한 경험을 정리한 글이다. 1. 분석 포켓몬고의 메인 화면에서 Pan제스처는 카메라의 회전을 담당한다. 캐릭터를 중심으로 원을 그리면서 Panning하면 해당 방향(시계 또는 반시계)으로 카메라가 회전한다. 이 제스처로 사용자 위치 주변을 360도로 둘러볼 수 있다. 또한 포켓몬고의 Pinch 제스처는 카..

    [IOS] Realm 사용해서 데이터 저장하기

    출시 프로젝트 중 API 통신으로 받아온 데이터를 앱 내부에 저장해놓고 사용해야 했는데 Realm SDK를 사용해서 데이터 모델을 설계했던 경험을 정리한 글이다. 1. 클래스 Realm은 DB에 저장할 타입으로 클래스를 사용한다. 구조체를 사용하지 않는 가장 큰 이유는 "live"에 포커스를 맞춰서 그렇다고 한다. Realm DB에 저장하려는 클래스는 Object 클래스를 상속해야하고 내부 프로퍼티에 @Persisted 라는 property wrapper 속성을 사용한다. class Place: Object { @Persisted(primaryKey: true) var contentId: Int @Persisted var image: String } 위의 Place 클래스는 DB에서 하나의 테이블처럼 취..

    [IOS] API 통신에서 겪은 SSL 인증서 및 ATS 관련 이슈에 대하여

    출시 프로젝트에서 공공데이터포털의 투어 API를 사용했다. HTTPS를 지원하는 API 서비스였기 때문에 출시 과정에서 문제없이 ATS를 사용할 수 있을 거라고 생각했지만 결국 보안 관련 이슈를 겪게됐고 문제의 원인과 해결 방법을 작성한 글이다. 1. 이슈를 겪게된 과정 나는 공공데이터포털에서 제공하는 오픈 API 서비스를 출시 앱에 사용하기 위해서 Alamofire를 통해 제공되는 URL로 네트워크 요청을 시도했는데 아래 콘솔 메시지가 출력됐다. Result : FAIL Error : Error Domain=NSURLErrorDomain Code=-1200 "An SSL error has occurred and a secure connection to the server cannot be made." ..

    [Sesac IOS] 21일차 TIL

    21일차 수업을 듣고 새로 배운 내용을 정리한 글입니다. Learned HTTP (Hyper Text Transfer Protocol) 네트워크(인터넷)를 통해 클라이언트와 서버가 데이터를 주고받을 수 있는 통신 규약 메시지가 문자(Text)로 구성되기 때문에 의도치않은 누군가가 메세지를 읽을 수도 있다. 클라이언트와 서버가 데이터 전송 시 서로간의 약속(통신 규약)을 지키기 때문에 통신 가능 네트워크 통신에 필요한 것 3가지 : 요청과 응답(HTTP 메시지), HTTP 메서드, 인증 키 1) HTTP 통신의 특징 단방향 통신 : 클라이언트가 요청하고 서버가 응답하는 방식 데이터를 주고 받기 위해서 반드시 클라이언트가 요청을 해야함. 비연결성 : 클라이언트가 요청할때마다 매번 새로운 연결을 생성함. 계속..

    [IOS] UIView의 tintColor 프로퍼티에 대하여

    앱의 화면에서 일관된 글자색과 배경색을 적용하기 위해 tintColor 프로퍼티를 사용하면서 공부하고 경험한 내용을 정리한 글입니다. 1. tintColor의 정의 애플의 개발자 문서에서는 다음과 같이 설명하고 있다. The first nondefault tint color value in the view’s hierarchy, ascending from and starting with the view itself. UIView의 틴트 컬러란 자기 자신의 뷰 객체부터 시작하여 뷰 계층을 따라 올라가면서 처음 만나는 default가 아닌 tintColor의 값을 리턴해주는 프로퍼티이다. tintColor는 시스템 UI가 활성화 상태일때 시각적으로 보여지며, system 타입의 UIButton에서 흔히 볼 ..

    [IOS] UserDefault 사용해보기

    간단한 예제를 통해 UserDefault를 사용해보고 작성한 코드를 리뷰하는 글입니다. 1. UserDefault란 앱에 대한 사용자의 데이터를 저장하는 애플의 기본 저장소 앱 마다 존재하며 샌드박스 시스템에 의해 관리됨 주로 푸쉬 알람 허용과 같은 사용자의 환경설정 값 등 가벼운 데이터가 저장됨 key-value 쌍의 형태로 데이터가 저장됨 2. 예제 1) 감정 다이어리 9가지 감정을 열거형 case로 정의 열거형의 rawValue를 UserDefault의 key로 사용 화면 로딩 시 감정별로 저장된 value를 읽어서 각 버튼의 타이틀에 보여줌 버튼 터치 시 value+1 을 새로운 값으로 저장하고 버튼 타이틀을 변경 @IBAction func touchButton(_ sender: UIButton..

    [IOS] 열거형을 사용해서 간단한 앱 만들어보기

    텍스트필드에 단어를 입력하면 단어의 뜻을 보여주는 간단한 앱을 만들면서 작성한 코드를 리뷰하는 글입니다. 1. 레이아웃 검색창(텍스트필드) 높이 = 루트뷰의 0.06배 검색 버튼 아이콘 (돋보기) 크기 SymbolConfiguration large로 설정 검색 창 아래 4개의 해시태그 버튼 각각의 Content Inset을 상하좌우 5 만큼 설정 → default 스타일의 버튼은 내부 글자 사이 여백이 좁아서 답답해보이기 때문에 가장 오른쪽 버튼의 trailing constraint를 최소 20으로 설정 → 버튼의 텍스트가 길어져도 최소한 루트뷰의 trailing보다 20만큼의 간격을 유지 컨테이너 뷰 생성해서 루트뷰 중앙에 위치시키고 좌우 20의 간격 설정, 컨테이너 뷰 높이 = 루트뷰의 0.4배 → ..

    [IOS] AutoLayout으로 현업의 서비스 화면 구성하기

    오토 레이아웃을 통해 현 서비스의 앱 화면을 만들면서 작성한 코드를 리뷰하는 글입니다. 1. 주문하기 화면 탭바의 첫번째 네비게이션 컨트롤러 배너 높이를 루트 뷰 높이의 0.2배로 설정 음식 카테고리 버튼들을 레이아웃 하기위해 1개의 수직 스택뷰와 4개의 수평 스택뷰 사용 수직 스택뷰 상하좌우에 20의 간격을 주어 수직 스택뷰의 너비와 높이 결정 수평 스택뷰의 높이를 결정하기 위해 수직 스택뷰 distribution을 fill equally 설정 하나의 수평 스택뷰에 4개의 서브뷰(어레인지뷰)가 들어감. 수평 스택뷰 distribution을 fill equally로 설정해서 각 서브뷰의 너비 결정 수평 스택뷰의 서브뷰들 간의 공간은 (spacing) 20 서브뷰(음식 카테고리) 하나의 높이와 너비가 결정..