요즘 모집공고의 우대 사항을 보면 UnitTest, 클린 아키텍쳐, TDD 이런게 꼭 한두가지씩은 들어가 있습니다. UnitTest와 TDD는 자바 스프링을 공부해 보신분이나 테스트 코드를 작성해 보신분을 알고 계시겠지만 TDD는 Test Driven Development로 테스트 주도 개발을 뜻합니다. IOS에서는 UnitTest를 통해 계속해서 테스트를 하면서 개발을 해나가는 것이지요. 말은 쉽지만 UnitTest를 하기 위해서는 각 기능을 분리시켜서 하나의 역할을 하게 코드를 구성해야 합니다. 하지만 마구잡이식으로 분리를 하다보면, 코드가 어지러워지고 가독성이 떨어질 수도 있고, 똑같은 기능을 하는 코드를 계속 다시 작성하는 경우도 있으며, 기능 하나 추가하는데 다른 기능의 소스코드를 수정해야 하거..
이번에 진행하고 있는 프로젝트에 본격적으로 클린 아키텍쳐, 객체지향 프로그래밍, solid 원칙 등등을 적용해 보기로 결정해서 공부해 보기로 했습니다. 우선은 객체지향 프로그래밍의 특성인 캡슐화와 은닉화에 대해서 알아보도록 하겠습니다. 은닉화 외부에서 내부의 변수나 연산등을 접근하지 못하도록 하는 것을 의미합니다. private를 붙이는것을 은닉화라고 할 수 있습니다. 또 함수 getter, setter를 이용해서 private로 선언된 변수를 접근 제어 하는것 역시 은닉화입니다. 캡슐화 실제로 구현되는 부분은 외부에 드러나지 않고, 사용하는 방법만 알려주고, 특정한 목적을 위해 필요한 변수나 로직을 하나로 묶어서 외부에서 사용 할 수 있게 해주는것을 캡슐화라고 합니다. 다만 아무거나 묶으면 안되고 목적..
Delegate 패턴을 사용할때 순환참조를 막기위해 protocol에 AnyObject를 상속 받습니다. AnyObject를 상속받지 않을시 delegate앞에 weak를 붙일경우 오류가 생기는것을 볼 수 있습니다. 'weak' must not be applied to non-class-bound 'DrawWaveFormManagerDelegate'; consider adding a protocol conformance that has a class bound 라는 에러가 뜹니다. 해석하자면 weak는 class에 타입에서만 사용가능한데, 해당 프로토콜은 어디서 사용할 지 모르니 weak를 붙일수 없다고 합니다. 그렇다면 class를 붙이면 되는데 왜 AnyObject를 붙여야 할까요? Zedd님 블로그..
서버 API에서 목록을 받아 테이블 뷰에 이를 표시할 때 이미지같은 어느정도 사이즈가 있는 것을 셀마다 넣어 줄 때가 있습니다. 이미지들을 넣을때는 보통, 서버에서 이를 받아와서 화면에 나타내는 식으로 처리를 합니다. 그런데 테이블 뷰의 셀은 reuse로 인해 화면 바깥으로 나간 후 다시 화면에 보이면 재사용하는 식으로 작동합니다. UIImage를 extension해서 셀의 이미지를 다운로드할 때 print를 찍어보았습니다. 셀이 reuse 되면서 계속해서 이미지를 다운로드 한다는걸 볼 수 있습니다. 테이블 뷰가 reuse 될때마다 계속 다운로드 하는것은 사용자의 많은 자원 소모와 앱의 성능 저하를 야기합니다. 이러한 문제를 해결하기 위해 NSCache를 이용합니다. NSCache란? 기본적인 개념은 캐..
IOS에서 작은 데이터 쪼가리를 암호화해 저장하는 기능입니다. 사파리의 아이디/비밀번호 저장기능이 그 예라고 할 수 있습니다. 단순히 아이디 비밀번호만 국한되는것이 아닌 신용카드 정보, 메모 등등을 암호화해 안전하게 저장해줄 수 있습니다. 또 KeyChain은 앱에 종속되는게 아닌 기기 자체에 종속이 됩니다. 따라서 앱이 삭제 된다 하더라도 저장된 값들은 그대로 남아있습니다. IOS와 MacOS의 Keychain은 keychain의 개수에서 차이가 있습니다. IOS의 KeyChain은 기기의 잠금 상태에 따라 KeyChain이 잠기고 열립니다. 그러나 MacOS는 여러개의 KeyChain을 지원합니다. 그래서 KeyChain 문서에 들어가시면 여러개의 키체인을 사용/관리할 수 있는 MacOS에서만 사용할..
음의 pitch값을 조정, 재생 속도를 조절할때는 AVAudioEngine을 사용한다. AVAudioEngine은 AVAudioPlayerNode로 음원파일을 재생시키고, MixerNode, AVAudioUnitVarispeed, AVAudioUnitTimePitch 노드를 추가해 사용자가 원하는 형태로 음원을 조정할 수 있다. AVAudioPlayerNode의 scheduleFile에는 AVAudioPlayerNodeCompletionCallbackType이라는 completionHandler가 있습니다. 이 핸들러는 재생되고 있는 음원파일이 재생이 끝나면 핸들러 내부의 코드를 실행합니다. 처음에는 단순히 여기에서 PlayerNode를 stop을 하고 다시 예약을 하면 되는게 아닐까 하고 개발을 했지만..