전체 글 썸네일형 리스트형 Divide Stream with "FlatMap" 처음 Combine을 공부할 때 map과 flatMap의 차이점을 공감할 수 없었습니다. 단순히 [String] -> String으로 flat하게 만들어주는 메소드로 이해했습니다. 하지만 이 친구는 생각보다 더 많은 일을 할 수 있는 친구였습니다. 오늘은 비동기적인 작업을 처리할 때 큰 힘이 될 flatMap에 대해서 소개하도록 하겠습니다. func flatMap( maxPublishers: Subscribers.Demand = .unlimited, _ transform: @escaping (Self.Output) -> P ) -> Publishers.FlatMap where P : Publisher, P.Failure == Never 파라미터 인자중에 transform을 보게 되면 새로운 Publish.. 더보기 Why Closure can't mutate Value type? closure 내부에서 value type 즉 struct, enum 값을 변경하려고 할 때 컴파일러는 빌드할 수 없다는 에러를 보여줍니다. 예전에는 그냥 class로 고치고 넘어갔던 문제였지만, 근본적으로 다시 돌아가서 "왜 변경할 수 없을 까"가 오늘의 주제입니다. (뇌피셜이기 때문에 다른 생각을 갖은 분들은 댓글에 생각을 남겨주시면 감사하겠습니다.) 역으로 escaping closure가 어떤 상황을 만날 수 있는지 생각해보면, 클로저를 선언시킨 시점과 클로저를 실행시키는 시점이 전혀 다른 상황일 수 있습니다. 즉 Thread Safe한 상황이 아닐 수도 있다는 겁니다. 1. Value Type의 특징 중 하나인 Thread Safe를 지킬 수 없기 때문에 컴파일러 단에서 막은 거 같습니다. 2. .. 더보기 Memory issue with closure injection Swift는 일급객체이기 때문에 클로저도 주입할 수 있어요! 적절한 상황에서 사용해야 이득이지, 잘못 사용하면 사용하지 않는 게 오히려 좋은 줄 몰랐습니다... (클로저 주입이 무조건 나쁘다는 말은 아닙니다. 환경에 맞게 잘 작성하시면 문제가 발생하지 않을 수도 있습니다.) 위 그림은 Store.dispatch 메소드를 ViewController로 클로저를 주입을 한 후, ViewController에서 Action이 발생했을 때 해당 클로저를 사용하는 부분입니다. 사실은 해당 클로저를 호출하게 되면, dispatch를 정의한 객체를 strong하게 잡은 상태입니다.(Store 객체) 그렇기에 클로저 주입을 하면, 참조에 관한 제어권을 잃어버리며 각 객체가 클로저 주입을 할 경우에 메모리에서 해제되지 않는.. 더보기 Custom Redux Testable 리덕스 패턴을 사용하면 여러가지 이득이 존재하지만, 오늘은 그중 하나인 "테스트"에 대해서 소개해 드리겠습니다. 글을 시작하기 앞 써 왜 많은 사람이 Test에 대해서 강조하는지, 제 개인적인 생각을 공유해드리겠습니다. 작성자가 아닌 다른 사람이 해당 코드를 수정할 때, 체크리스트를 제공합니다. 일하면서 가장 무서운 코드는 왜인지는 모르겠지만, 동작하는 코드였습니다. 다시 말해서 사이드 이펙트가 어디서 발생하고, 어디서 핸들링하는지 알 수 없는 코드였습니다. 이런 상황을 방지하기 위해서 우리는 해당 코드를 수정할 다른 사람에게 준수해야 할 체크리스트를 제공할 의무가 있습니다. Q: 그래서 어떤 객체를 테스트 해야 하나요? 여러 개의 객체 중에 Reducer를 테스트할 겁니다. 특정 Action이 발생했을.. 더보기 Real Time UI Test 앱을 개발하다 보면 크고 작은 이슈 때문에 뷰를 디버깅하는 상황이 빈번하게 발생합니다. alignment 수정하고, 간격 줄여보기 또는 hugging 값 변경하기 등등. 그 후 원하는 결과 값이 나오는지 확인하기 위해서 프로젝트를 빌드를 하고, 새로운 뷰를 개발할 때 원하는 결과가 나오는지 수시로 빌드를 합니다. 빌드하고 해당 뷰를 확인할 때 소모되는 시간을 무시할 수 없을정도로 크다고 생각합니다. 매번 이런 번거로운 작업을 도움을 줄 기능은 바로 SwiftUI입니다. 앱 최소 버전이 iOS 13.0이 아닌데요? 신경 쓸 필요 없습니다. 모듈을 분리하거나 디버깅 용도로만 사용할 수 있습니다. Preview with SwiftUI SwiftUI에서 UIKit을 사용하기 위해서 제공되는 두 가지 프로토콜이 .. 더보기 Custom Redux in Swift Redux는 무엇인가요? 위 그림이요. "예측 가능한 상태 컨테이너." 한 문장으로 디자인 패턴을 표현했기 때문에, 처음 Redux를 공부하는 사람에게는 아무 도움이 되지 않는 문장일 겁니다. 위 문장을 이해하기 위해서 도움을 줄 멤버를 소개하겠습니다. 1. Action 뷰에서 특정한 장소(Store)로 이벤트를 전달할 때 사용할 멤버입니다. 아래 그림을 봤을 때 사용자 이벤트가 발생했을 때, 이를 Action이라는 열거형으로 정의하게 될 겁니다. 뷰에서 버튼이 눌렀을 때 추가적인 작업을 할 필요 없이, 특정 Action이 발생했다고 특정한 장소(Store)로 보내기만 할 겁니다. 추가로사용자 이벤트뿐만 아니라 사용자 눈에 보이지 않는 이벤트들도 존재할 수 있습니다. (가령 초기 데이터를 받거나, 다른 .. 더보기 UIAlertController Layout issue UIAlertController를 기본적인 API만 사용해서 구현한 후, 뷰 디버깅으로 잘못된 부분이 없나 확인 중에 전혀 예상할 수 없었던 레이아웃 이슈를 확인했다. 잘못작성한 코드가 있을 수 없다고 생각이 들어 검색을 한 결과 여러가지 iOS버전에서 발생하는 버그라는 글을 확인했다... 이 글을 읽는 사람들은 부디 시간 낭비하지 않기를 바란다. https://stackoverflow.com/questions/55372093/uialertcontrollers-actionsheet-gives-constraint-error-on-ios-12-2-12-3 더보기 take, involve, require take + (time, effort, courage ..) 무엇을 하는데 (노력, 시간)을 소비하다 It took a lot of getting used to involve 무엇을 하는데 동반, 수반되는 participative: 참여적 It involved so much more collaborative work It involved so much more participative work with other students require(take와 유사함) 무엇을 하기위해 필요한, 조금더 강조되는 than what I was used to: 내가 익숙한 것 보다 so It required me to be a lot if more active than what I was used to 더보기 이전 1 2 3 다음