본문 바로가기

iOS

(41)
iOS) RxSwift 가볍게 훑어보기 (2) PublishSubject PublishSubject Observer이면서 Observable Subject로 전달되는 이벤트를 Observer로 전달하는 가장 기본적인 Subject이다. 즉 이벤트를 전달하는 역할과 이벤트를 전달받는 역할 모두를 할 수 있다. 코드로 알아보자 let dispose Bag = DisposeBag() enum MyError: Error { case error } 기본적인 세팅은 다음과 같이 할 수 있다. let subject = PublishSubject() 위 코드에서 subject는 문자열이 포함된 next event를 받아서 다른 observer에게 전달할 수 있다. 생성자를 호출할 때에는 파라미터를 전달하지 않는다. subject는 비어있는 상태로 생성되는 것으로, 생성 시점에는 내부에 아무..
iOS) RxSwift 가볍게 훑어보기 (1) Observable Hello RxSwift RxSwift란? ReactiveX 라이브러리를 Swift 언어로 구현한 것이다. 그렇다면 ReactiveX는 무엇일까? 공식 홈페이지에 들어가보면 다음과 같이 적혀있다. An API for asynchronous programming with observable streams 여기서 주목해야 할 키워드는 asynchronous와 observable이다. 비동기적으로 발생한 이벤트를 관찰 가능하게 만들어 반응형 프로그래밍을 할 수 있도록 한다. 정확한 정의는 아니지만 지금 당장은 이정도로 생각해 볼 수 있다. 더 자세한 내용은 추후에 포스팅 할 계획이다. 왜 RxSwift? 그렇다면 장점은 무엇일까? RxSwift의 장점은 단순하고 직관적인 코드를 작성할 수 있다는 것이다. ta..
CS) 프로세스와 스레드 프로세스와 스레드 프로세스란? 실행중인 프로그램 프로세스는 실행중인 프로그램으로 메인 메모리에 존재한다. 실행중이지 않은 프로그램의 경우 저장장치에 있으며 프로세스는 언제든 CPU가 실행시킬 수 있는 상태에 있는 것이다. 시스템 콜을 통해 자원을 요구하는 주체이기도 하다. 시분할 시스템의 경우 여러 개의 프로세스를 동시에 수행하는데 이를 멀티 프로세싱 혹은 멀티 태스킹이라 한다. 멀티 프로세싱은 멀티 프로세서와 혼동될 수 있어 보통 멀티 태스킹을 더 많이 쓴다. 하나의 프로그램이 수행 중 여러 개의 프로세스를 만드는 경우도 있다. 프로세스는 사용자 프로세스와 시스템 프로세스로 나뉠 수 있는데, 자원 경쟁 측면에서는 동일하다. 사용자 프로세스: 응용 프로그램이 실행되는 것 시스템 프로세스: 운영체제가 필요..
iOS) 오토 레이아웃과 오토 리사이징 Auto Layout 제약조건 속성 제약조건은 다음과 같이 적용된다. Item1의 항목 = Item2의 항목 * Multiplier + Constant 제약조건의 속성으로는 다음의 세 가지가 있다. Relation: 동일, 이상, 이하 Multiplier, Constant: 제약조건의 값 Priority: 우선순위 제약조건 경쟁 Relation 제약조건 간 경쟁에 영향을 미치는 요소로 관계(relation)가 있다. 예를 들어 레이블 A에 대해 중앙에 위치해야 하고, 왼쪽으로 100 포인트 이상 떨어져야한다는 제약조건이 있다고 가정해보자. 레이블 A는 크기 유지라는 제약조건이 있을 때 경쟁이 발생할 수 있다. Priority 우선순위가 높은 것이 먼저 적용된다. 우선순위는 최대 1000까지의 자연수로 표..
iOS) Dark Mode 지원하기 Color Asset 생성 1. Color Asset들을 담을 폴더 생성 Assets.xcassets -> 오른쪽 버튼 클릭 -> Folder 굳이 폴더를 안만들어도 되지만 깔끔하게 정리하기 위해 만들자. 2. 생성한 폴더에 Color Set 생성 생성한 폴더 명을 원하는 이름으로 바꾸고 해당 폴더에서 오른쪽 버튼을 눌러 Color Set을 추가한다. 3. Any와 Dark에 대해 컬러 지정 Color Set을 생성하면 기본적으로 Appearances가 Any, Dark로 지정된다. 여기서 Any는 다크모드가 지원되지 않는 오래된 버전에서의 색상값을 지정할 때 사용한다. 현재 프로젝트에서는 라이트모드가 Any와 동일하므로 Any, Light, Dark 대신 Any, Dark으로 하였다. 각 모드에 대해 ..
iOS) SwiftLint 적용하기 - CocoaPods SwiftLint A tool to enforce Swift style and conventions, loosely based on GitHub's Swift Style Guide. Realm에서 제공하는 Swift 전용 Lint이다. 여기서 Lint란 소스 코드를 분석하여 프로그램 오류, 버그, 스타일 오류, 의심스러운 구조체에 표시(flag)를 달아놓기 위한 도구들을 가리킨다. 1. CocoaPod 설치 sudo gem install cocoapods 혹시 CocoaPod이 설치되어 있지 않다면 다음의 명령어를 실행하면 된다. 2. CocoaPod 적용 pod init 터미널에서 프로젝트 디렉토리로 이동한 후 pod init을 한다. 그러면 다음과 같이 Podfile이 생성된다. 3. Podfile ..
iOS) gitignore 적용하기 gitignore Specifies intentionally untracked files to ignore 프로젝트를 깃에 올릴 때 특정 파일이 추적되지 않도록 하기 위해서 사용한다. 보통 불필요한 충돌을 발생시키는 것을 막거나 공유되지 말아야 할 프로젝트 정보를 감추기 위해 사용된다. 만일 프로젝트 진행 중에 gitignore를 추가하면 이미 추적된 파일에 대해서는 적용되지 않는다. 추가 방법 gitignore.io를 이용하면 쉽게 gitignore 파일을 생성할 수 있다. gitignore.io에서 원하는 키워드를 다음과 같이 작성한다. 그러면 위와 같은 text가 생성된다. 전체 선택하여 복사한 후 프로젝트를 진행할 디렉토리에 .gitignore 파일을 생성하면 된다. 당연히 디렉토리는 깃과 연결된..
iOS) Core Data - 다른 저장소와의 비교 Core Data Persist or cache data and support undo on a single device. 코어 데이터는 데이터를 저장하고 관리하기 위한 프레임워크이다. 코어 데이터의 경우 해당 기기에 데이터를 저장하므로 오프라인에서도 동작 가능하며, 클라우드를 제외하고는 데이터를 공유할 수 없다. Object Object-Oriented Database 코어 데이터의 경우 SQL을 쓸 일 없이 오롯이 Object-Oriented 방식으로만 데이터를 다룰 수 있다. 데이터는 Object로 표현되며, NSManagedObjectModel의 인스턴스로 구현된다. 이러한 Object가 관계를 형성하여 Object Graphs를 이루고 이를 관리하는 프레임워크가 바로 코어 데이터이다. Map 어..
iOS) UIViewController view를 다루는 것에 focus되어있는 controller 기본적으로 하나의 view property를 가지고 있다. 가끔 교체하는 경우도 있지만 안건드는 것이 좋다. 기본적으로 뷰 컨트롤러는 화면을 꽉 채우는 것이 목적이다. 화면을 보여주는 단위로는 스크린이 있다. 그 스크린 안에 윈도우라는 개념이 있다. 윈도우는 스크린에 들어가는 실제적인 뷰이다. 그 위에 올라가는 것이 뷰이다. 기본적으로 화면을 보여주기 위해 세 가지 정도가 있다. 초창기에는 뷰 컨트롤러가 꽉 채운 화면만 되었는데 요새는 다른 역할도 한다. ViewController와 MVC MVC 패턴에서 C 역할을 하지만 뷰에 집중되어 있다. 화면 전체 콘텐츠를 담당하거나 특정 영역을 담당한다. 앱을 개념적으로 생각해보면 어떤 뷰컨트롤러 하나..
SwiftUI) 사용자 이벤트 수집 및 Alert로 확인 사용자 이벤트 사용자 이벤트란? 사용자가 앱을 이용하면서 발생할 수 있는 상황에 대해 정의한 것으로, 앱 개선을 위해 수집할 만한 정보를 선정하여 데이터화 한 것입니다. 크게 화면 전환 이벤트와 버튼 클릭 이벤트가 있을 수 있습니다. protocol Event { var name: String { get } var createdAt: String? { get } var metadata: [String: String]? { get } } 이벤트가 무엇에 대한 것인지 이벤트명(name)과 생성된 날짜(createdAt), 기타 세부사항(metadata)를 수집하였습니다. 예로 홈 화면에서 플레이리스트 화면으로 전환되었다는 것을 다음과 같이 표시할 수 있습니다. Event(name: "PlaylistViewd..