Ray Wenderlich
-
Ch12. Merge ConflictsRay Wenderlich/Mastering Git 2021. 8. 23. 00:58
What is a merge conflict? Git은 Merge를 할 때, Longest Common Subsequence(LCS)를 사용한다. 먼저 내가 수정한 파일과 Common ancestor의 변경사항을 비교하여 공통부분을 찾는다. 그 다음, Merge할 브랜치의 파일을 Common ancestor와 비교하여 공통부분을 찾는다. Git은 이 방식으로 LCS를 찾아낸 뒤 비교해본다. "What has changed between the common ancestor and this new file?" 그 다음, "Now, of those changes in each pair of files, are there any sets of lines that have changed differently be..
-
Ch11. How Does Git Actually Work?Ray Wenderlich/Mastering Git 2021. 8. 23. 00:57
Git은 SHA-1해쉬 값으로 모든 Commit을 참조한다. Dissecting the commit git log -5 --oneline f8098fa (HEAD -> master, origin/master, origin/HEAD) Merge branch 'clickbait' with changes from crispy8888/clickbait d83ab2b (crispy8888/clickbait, clickbait) Ticked off the last item added 5415c13 More clickbait ideas fed347d (from-crispy8888) Merge branch 'master' of https://www.github.com/belangerc/ideas ace7251 Addi..
-
Ch3. Transforming OperatorsRay Wenderlich/Combine 2021. 1. 27. 20:26
collect() ["A", "B", "C", "D", "E"].publisher .collect() .sink(receiveCompletion: { print($0) }, receiveValue: { print($0) }) .store(in: &subscriptions) // collect에 parameter전달하여 메모리 과다사용 방지 ["A", "B", "C", "D", "E"].publisher.collect(3) .sink(receiveCompletion: { print($0) }, receiveValue: { print($0) }) .store(in: &subscriptions) ["A", "B", "C", "D", "E"] finished ["A", "B", "C"] ["D", "E"] fi..
-
Ch2. Publishers & SubscribersRay Wenderlich/Combine 2021. 1. 27. 20:23
Hello Publisher let myNotification = Notification.Name("MyNotification") let center = NotificationCenter.default let observer = center.addObserver(forName: myNotification, object: nil, queue: nil) { (notification) in print("Notification received!") } center.post(name: myNotification, object: nil) center.removeObserver(observer) Notification received! Hello Subscriber let myNotification = Notific..
-
Ch1. Hello, Combine!Ray Wenderlich/Combine 2021. 1. 27. 20:22
애플이 말했다. ‘The Combine framework provides a declarative approach for how your app processes events. Rather than potentially implementing multiple delegate callbacks or completion handler closures, you can create a single processing chain for a given event source. Each part of the chain is a Combine operator that performs a distinct action on the elements received from the previous step’'컴바인은 여러분의..
-
Ch2. The TDD CycleRay Wenderlich/TDD 2020. 10. 4. 21:55
4 Steps TDD는 4개의 단계가 있다. 이 단계들은 보통 컬러로 표현된다. (color coded) Red: 앱의 코드를 작성하기전에 실패하는 테스트를 작성 Green: 테스트를 통과시킬 수 있는 최소한의 코드를 작성 Refactor: 앱코드와 테스트코드를 정리 (리팩토링) Repeat: 모든 피쳐들을 구현할 때까지 이 사이클을 반복 Red: Write a failing test Production코드를 작성하기 전에, 실패하는 테스트 코드를 먼저 작성하자. class CashRegisterTests: XCTestCase { func testInit_createsCashRegister() { XCTAssertNotNil(CashRegister()) } } CashRegisterTests.defaul..
-
RxSwift - MVC, MVVP with RxSwiftRay Wenderlich/RxSwift 2020. 2. 29. 22:14
MVCRxSwift는 MVVM과 엄청난 하모니를 자랑한다. 애플에서는 MVC를 주로 사용하여 훌륭한 시스템을 구축했다. 둘의 차이를 간략하게 알아보자.둘은 굉장히 가까운 사촌관계라고 볼 수도 있다. 하지만 그 둘은 분명히 다르다. 이 책에서 대부분의 예제를 MVC로 설명했다. MVC는 굉장히 직관적이고 간단한 앱을 만들 때 굉장히 유용하다.Controller는 모델과 뷰를 업데이트할 수 있는 중심역할을 하고,View는 데이터를 화면에 표현해주는 역할Model은 데이터를 Read/Write하며 저장하는 역할을 했다. MVC가 초반에는 앱을 만드는데 꽤나 좋은 패턴이다. 하지만 앱의 규모가 커질수록 많은 클래스들이 뷰도 모델도 아닌 상황이 발생한다. 자연스레 이런 애들은 컨트롤러로 때려박는다.우리가 흔히 범..
-
RxSwift - withLastestFrom(_:), sample(_:)에 대해서 알아보자Ray Wenderlich/RxSwift 2020. 2. 10. 20:58
Ch9. Combining operatiors p.191 - p.193앱은 여러가지의 인풋을 다룬다. 여러 Observable에서 발생하는 이벤트들을 동시에 관리해야하는 경우가 많이 있을 것이다.버튼을 누르는 등의 간단한 트리거 역할을 하는 인풋이 있을 수 있고, 동시에 다른 인풋에서는 데이터가 전달 될 수도 있다.RxSwift는 이런 상황에 적절한 Operator를 제공하고 있다. withLatestFrom(_:)그림을 보면 두 개의 시퀀스가 있다.그리고 withLatestFrom을 사용한 시퀀스가 있다.tap 이벤트가 발생할 때, textfield의 마지막 Element의 값이 전달되고 있다. 우리가 자주 하는 UI코딩에서, button과 textfield를 사용하는 상황을 가정하고 있다. (뒤에서 ..