iOS
![[iOS] Tuist - 3. Target 생성](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDZcKT%2FbtrXVsFje2d%2F7ip7D0ekK0UUsKDu9cNUkK%2Fimg.png)
[iOS] Tuist - 3. Target 생성
드디어! 남은 건 Tuist Code 작성뿐이다!! 이지만 Code가 사실 반이상이라는 것! 오늘은 Target을 생성하는 코드부터 먼저 정의해보도록 하겠습니다. 어차피 Swift 코드니까 각자가 편한대로 코드를 작성할 수 있잖아요? Target Enum 그러니 Target을 나눌 Enum부터 정의해줍시다. 정의는 그냥 Project+Templates 파일에 했습니다. 별로 파일 만들어도 상관없는것 같아요. public enum TargetType: String { case dev = "" case test = "Test" case content = "Content" case service = "Service" public var bundleID: String { "com.Rey.AppName" } p..
[iOS] Tuist - 2. 프로젝트 파일 정리
지난편에서 Tuist를 써봤다. 이제 Tuist에 사용될 파일을 가져와보자. 먼저 App Setting File을 준비하자 세가지 종류의 파일을 준비했다. - xcconfig - entitlements - plist xcconfig는 지난편에 가져왔고, entitlements와 plist도 특별한 것 없이 그냥 기존 프로젝트에 있는 파일을 가져오거나 복사해와도 된다. Project.swift가 있는 경로에 App이라는 폴더를 만들었다. 그 안에 세 종류의 파일을 나누기 위해 폴더를 만들고 각 종류에 맞는 파일을 넣었다. App ├── Configuration │ ├── Content-Debug.xcconfig │ ├── Content-Release.xcconfig │ ├── Content-Shared.x..
![[iOS] Tuist - 1. XcodeGen에서 Tuist로](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fm4BZ6%2FbtrXRVazIOO%2FMtgbMzHkUkj3f0wxWxGHuK%2Fimg.png)
[iOS] Tuist - 1. XcodeGen에서 Tuist로
기존 프로젝트는 XcodeGen으로 관리되고 있었다. 이전에 XcodeGen을 사용했던 이유는 2~3개월의 짧은 협업 기간이 있었지만, 그 사이에 pbxproj에서 엄청난 Conflict를 겪었기에 도입을 했다. 실제로 도입이 된 시기엔 나 혼자였다. 대부분은 프로젝트의 모듈화를 위해 Tuist를 사용하지만, 나의 경우는 모듈화보단 릴리즈와 테스트(디버그) 빌드를 쉽게 나누고 싶었다. 물론 추후에 생길 모듈화도 염두한 작업이다. 0. 요구사항 - 하나의 소스를 공유하는 두개의 타겟이 필요함 (Release, Debug) - Debug 빌드는 Notification 기능이 필요하지 않지만, 독립된 BundleID를 가지고 TestFilght에 업로드가 가능해야함 1. 준비물 xcconfig 파일 Xcode..
[RxSwift] Relay
Relay도 Subject처럼 다른 Observable로부터 이벤트를 받아서 Subscriber로 전달할 수도 있다. Observable인 동시에 Observer이다. PublishRelay: PublishSubject Wrapping BehaviorRelay: BehaviorSubject Wrapping ReplayRelay: ReplaySubject Wrapping (RxSwift 6+) Next 이벤트만 받고 Error와 Completed 이벤트는 받지 않는다. 주로 종료없이 계속 전달되는 이벤트 Sequence를 처리할 때 활용한다. Next 이벤트만 다룬다. Error와 Completed 이벤트는 전달받지도 전달하지도 않는다. 그렇기 때문에 종료되지 않는다. Subscriber가 Dispose되..
![[RxSwift] Subject - AsyncSubject](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcHC5Ji%2FbtrL5R4JDfa%2FId0hhXeaRdnz0yJDOqxVQ1%2Fimg.png)
[RxSwift] Subject - AsyncSubject
let asyncSubject = AsyncSubject() Completed 이벤트가 전달되었을때 마지막 Next 이벤트를 Subscriber에게 전달한다. asyncSubject .subscribe { print("AsyncSubject 1", $0) } .disposed(by: disposeBag) asyncSubject.onNext(1) asyncSubject.onNext(3) asyncSubject.onNext(5) Completed 이벤트가 없기 때문에 Subscriber에게 이벤트가 전달되지 않는다. asyncSubject.onNext(4) asyncSubject.onError(MyError.error) // Output AsyncSubject 1 next(4) AsyncSubject 1 c..