xcode (27) 썸네일형 리스트형 [IOS] UI Test 오늘은 저번 포스팅에 이어서 UI Test를 진행하는 방법에 대해 알아 보겠다. 먼저 Project의 General 탭 하단에 + 버튼을 눌러 UI Testing Bundle을 생성해 주면 된다. 이렇게 Test Bundle을 생성하게 되면 test 진행을 위한 swift 파일이 만들어지게 되는데 해당 파일에서 Test 코드를 작성하여 테스트를 진행하면 된다. 그런데 UI Test에서 봤던 testExample 메소드와는 차이점이 있는 걸 확인할 수 있다. app을 launch 시키는 로직이 존재하고 있는데 UI Test를 위해서 app을 실행한다고 이해하면 되겠다. func testExample() throws { // UI tests must launch the application that they.. [IOS] Unit Test 사내에서 Unit Test와 UI Test 고도화를 위해 새로운 TF가 신설되었고 해당 팀의 구성원으로 들어갈 수 있는 기회를 얻었다. 지금까지 테스트 코드를 작성하면서 작업을 진행해오지 않았던 터라 어디서부터 시작을 해야 될지 감이 오지 않고 있는 상태이다. 물론 맛보기로 간단한 테스트 코드 작성과 테스트 진행 플로우를 익혀보고자 경험 삼아 진행해 본 적은 있었지만 오래전의 일이라 기억이 가물가물한 상태이다. 그래서 이번 기회에 처음부터 다시 Unit Test를 배워본다는 느낌으로 감을 살려보고자 글을 작성해 보려 한다. 먼저 Unit Test Bundle을 만드는 방법에 대해 소개하고자 한다. 프로젝트 생성하기 전 시점이라면 프로젝트 생성 시 아래 이미지와 같이 Include Tests를 체크하면 자.. [IOS] Submodule 설정 앱 내의 새로운 피쳐 개발이나 수정 작업이 아닌 프레임워크 작업이라는 좋은 경험을 회사에서 하게되었다. 이번 포스팅에서는 해당 작업을 위한 세팅 작업과 시작하게된 계기를 간단하게 소개하려한다. 어느 환경에서 무엇을 위해 어떤식으로 쓰였는지에 대한 예시를 들자면 A_Project와 B_Project가 존재하고 있으며 각각의 프로젝트는 동일한 비즈니스 로직을 가지고 있는 View를 가지고 있다고 가정하면 될것같다. 그리고 A_Project에서 디자인 수정 요청이 들어왔으며 해당 작업은 B_Project에서도 동일하게 변경될것을 요청한다고 했을때 각 프로젝트에 개별적으로 변경사항 작업을 진행하여 따로따로 반영하는 방법이 있을수 있고 또는 해당 화면을 프레임워크화 하여 변경사항을 한번의 수정 작업으로 두개의 프.. [ISSUE] Lottie Animation 백그라운드 진입 후 멈춤 현상 이번 포스팅은 Lottie 애니메이션 사용시 발생했던 이슈에 대해 포스팅 하려 한다. 필자는 Lottie 애니메이션이 동작하고 있는 뷰를 그리고 있었다. 그리고 작업 마무리 시점에 테스트 도중 애니메이션과 연관된 이슈를 만나게 되었다. 이슈 내용은 백그라운드 진입후 포어그라운드로 재진입시 애니메이션의 동작이 멈춰있는 현상이 발생하고 있었던것이였다. 그리하여 그다지 무겁지 않았던 이번 이슈의 리졸브 경험을 기록하려 한다. 해당 작업은 사내 프로젝트이기 때문에 새로운 프로젝트로 포스팅을 이어나가보겠다. 세팅 작업으로는 Lottie 파일 1개와 AnimationView를 준비했다. 그리고 애니메이션의 play 동작 호출까지 작성을 했다. class ViewController: UIViewController {.. [ISSUE] enumerateAttribute를 사용한 부분적으로 Font 변경 이번 포스팅은 enumerateAttribute라는 메소드를 사용하므로써 NSMutableAttribbutedString에 적용 되어있는 속성을 부분적으로 수정하여 최종적으로 기대한 값과 동일한 Attribute 결과를 도출해내는 과정에 대해 알아보겠다. 예를들어 label에 표현해줄 text 값을 서버에서 내려 받아 설정해준다고 가정을 하겠다. (html 형태의 String 타입의 값) 아래와 같이 내려온다고 가정 했을때 "12 34 56 78" html을 변환하는 기본적인 방법을 사용하여 진행해보겠다. let resultAtt = NSMutableAttributedString() let data = "12 34 56 78".data(using: .utf8) let att = try! NSAttribu.. [RxSwift] Operators (1) RxSwift에서는 새로운 Observable을 생성한다거나, 방출되는 요소를 필터링, 혹은 여러 Observable을 하나로 합친다거나 하는 다양한 메소드들이 있다. 그리고 이런것들을 연산자(Operator)라고 부른다. (연산자는 새로운 Observable을 return한다.) 연산자는 보통 subscribe 앞에 추가한다. 즉 구독자(observer)에게 전달되기 전까지 전달 되어야 할 데이터를 원하는 만큼 가공한 후에 전달되게끔 의도할 수 있다. Create Operators just 먼저 just 연산자에 대해서 알아보겠다. just 연산자는 하나의 항목을 방출하는 Observable을 생성한다. (파라미터로 하나의 요소를 받아서 Observable을 return) let element = "S.. [RxSwift] Subject & Relay 지난 포스팅에서 Observable은 이벤트를 observer에게 전달하고, observer는 Observable을 구독하여 전달되는 이벤트를 처리한다고 했다. Observable은 observer와 달리 다른 Observable을 구독하지 못하며(observer만이 구독 가능) observer는 다른 observer로 이벤트를 전달하지 못한다.(Observable만이 이벤트 전달 가능) 여기서 Observable과 observer의 역할을 동시에 수행할수 있는 Subject라는 것이 나왔다. Subject는 다른 Observable로부터 이벤트를 받을수도 있으며 Subject를 구독하고 있는 구독자에게 이벤트를 전달할수도 있다. 그러니 Subject는 Observable인 동시에 observer인 샘이.. [RxSwift] Observables & Observer 이번에 이직을 준비하면서 한동안 블로그 관리를 하지 못했다. 그리고 그 과정에서 과제를 받아 미니프로젝트를 진행하게 되었고 RxSwift를 프로젝트에 도입해볼 기회가 생겼었다. RxSwift를 사용하기 전에는 주로 비동기적으로 발생하는 결괏값을(Networking 작업, 시간이 오래걸리는 작업 등등) 사용하기 위해 complition block을 통한 비동기 처리 사용으로 작업을 해왔더라면 RxSwift에서는 Observable이라는 클래스로 감싸진채로 값을 바로 return 받아 비동기 처리를 동기 처리한것 마냥 사용을 할 수 있다는걸 알게 되었다. RxSwfit를 사용하지 않고 callback 함수의 구현으로 비동기 처리를 진행 한다고 가정했을때 상황에 따라 계속적인 callback이 발생할수도 있어.. [SwiftUI] Stack 이번 포스팅에서는 SwiftUI에서 View를 배치하는 데 사용하는 ContainerView이자 하나의 View인 Stack에 대해서 알아보겠다. UIStakcView 같은 역할인데 UIKit에서는 반복되는 view들의 정렬 같은 상황에서 개발자가 선택적으로 사용을 했다면 SwiftUI에서는 거의 필수적으로 사용을 함과 동시에 사용법도 매우 간단해졌다고 한다. 먼저 가로 방향으로 View들을 나열하는 Horizontal Stack에 대해 알아보겠다. 두개의 사각형 View를 가로 Stack으로 위치시키면 하단과 같은 모습으로 나오게 된다. HStack { Rectangle() .fill(Color.green) .frame(width: 100, height: 100, alignment: .center) R.. [IOS] Timer 이번 포스팅에서는 Timer를 사용해서 정해진 interval 간격을 두고 label의 text를 업데이트 해주는 과정을 간단하게 포스팅하려한다. 먼저 업데이트 상황을 눈으로 볼 수 있게 정중앙에 label을 하나 위치시키겠다. 그리고 count라는 변수를 만들어서 값이 바뀌면 label의 text를 변경해주게끔 옵저버 프로퍼티를 사용하겠다. var count = 0 { didSet { label.text = String(count) } } Timer가 작동되어 1초마다 count값을 변경시켜주도록 하면 label의 text의 값이 변경된 값으로 변경되는걸 볼 수 있을것이다. Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { [weak self] (.. 이전 1 2 3 다음