티스토리 뷰

 

 

 스토어  올리기 Index

 

1 (https://atelier-chez-moi.tistory.com/84)

개발자 계정 구매  활성화 문제 해결, Failed with exit code 1 해결, 인증서 문제 해결 과정

2 (https://atelier-chez-moi.tistory.com/85)

 스토어 커넥트 둘러보기, 개인정보 처리방침 URL 만들기, TestFlight   올리기

3 (https://atelier-chez-moi.tistory.com/91)

TestFlight 테스터 관리, 스크린샷 피드백, pageSheet 문제 수정, 가로모드 허용 금지

4 (https://atelier-chez-moi.tistory.com/93)

UserNotification

5 (https://atelier-chez-moi.tistory.com/94)

AVSpeechSynthesizer(TTS, Text To Speech) 사용법, UserDefaults

6 (NOW)

AVSpeechSynthesizer 2, Singleton Pattern

7 (https://atelier-chez-moi.tistory.com/96)

무음 모드(Slient mode) 소리 재생 방법, App store screenshot

 

 

 

5탄의 마지막 사진

 

  마지막의 handleRateChange() 메서드를 통해서 변화가 추적 될때마다 전역변수 willPassValue 에 그 값을 담아주는 것으로 5탄을 마무리 했었습니다.. 

 

 

< AVSpeechBoundary >

 

 

그 다음은 저 세 가지 버튼에 대해

 

파랑색 버튼을 누를 경우에는 위의 예문을 현재 슬라이더의 값의 속도로 예문을 들어볼 수 있도록 하였고,

빨강색 버튼을 누를 경우에는 앱을 처음 다운 받았을 때 처럼 발음 속도의 기본값으로 정해주도록 하였습니다.

그리고 설정을 누를 경우에는 슬라이더의 값을 UserDefaults 에 저장하고 이 뷰 컨트롤러를 Dismiss 해주도록 하는 구조입니다.

 

  문제의 상황은, 만약 발음을 들려주고 있는 경우에 사진의 오른쪽 뷰를 Dismiss 해줄 경우에는 발음이 계속해서 작동한다는문제가 있었다. 물론 왼쪽 뷰의 발음 읽어줄 때도 같은 현상이 발생한다.

 

  이에 대한 해결방법은 간단하다. AVSpeechBoundary 를 이용하면 된다.

 

 

열거형으로 선언되어있는 이 친구는 두 가지의 Constants 를 가지고 있는데..

 

- immediate : 무엇을 말하고 있던 무조건 읽어주기 종료.

- word : 말하고 있는 상황에서 단어까지만 끊어서 그 다음에 종료.

 

두 가지 중 원하는 것을 사용하면 된다.

오른쪽 뷰를 Dismiss 하기 때문에, 오른쪽 뷰의 경우에는 viewWillDisappear, viewDidDisappear, deinit 메서드를 활용해볼 수 있겠다.

나는 이 뷰 컨트롤러의 Deinit 을 확인할겸 여기에 선언을 해주었다.

진짜 직관적이다라는 생각이 들었던게 저걸 그대로 읽으면 쉽다.

신디사이저가 말하고 있는 중(synthesizer.isSpeaking == true)이라면,

즉시(=AVSpeechBoundary.immediate) 말하는걸 중지한다(=stopSpeaking). 

크으... 이름 잘 지었다.

 

아무튼 이렇게 해서 발음 정지에 관해서는 해결이 되었다.

다 끝난줄로만 알았던 문제가 생각지도 못했던 곳에서 생겨났다.

 

 

  단어가 들어가있는 네모가 바로 이 뷰컨트롤러 내에 선언한 Collection View 의 Cell 인데, 이 Cell 을 정의한 클래스에 발음 읽기를 구현해주는 AVSpeechSynthesizer() 가 구현되어 있다. 이 Cell 에서는 viewDidDisappear 라던가 Deinit 과 같은 메서드를 가지고 있지 않기 때문에 이 뷰 컨트롤러에서 따로 AVSpeechSynthesizer() 인스턴스를 생성하여 구현을 해주었다.

 

하지만 느낌상 인스턴스 메모리 주소가 다르기 때문에 안될 거라는 직감을 느꼈고 역시나... 발음을 작동한 상태에서 이 뷰 컨트롤러에서 벗어났을 때 정지가 되지 않았다. 순간 나도 뇌 '정지'가 왔고 어떻게 해야 할까 고민하고 있었다.

 

또 이때 갑자기 나타난 승진이가 싱글턴 패턴을 구현해볼 것을 추천하였다. 공부만 했던 싱글턴 패턴... 모르는 것은 아니였는데 이렇게 사용하는 구나.. 하고 느낌을 얻을 수 있었다. 이제 싱글턴 패턴을 사용해 AVSpeechSynthesizer 를 구현해보자.

 

 

< Singleton Pattern >

 

그래서 싱글톤(Singleton) 패턴이 뭔데?

 

- 특정 클래스의 인스턴스에 접근할 때 항상 동일한 인스턴스만을 반환하도록 하는 설계 패턴

- 한 번 생성된 이후(싱글톤으로 만든 인스턴스)에는 프로그램이 종료될 때까지 항상 메모리에 상주

- 어플리케이션에서 유일하게 하나만 필요한 객체에 사용

- 예시 : UIApplication(앱에 대해서는 하나의 클래스만 있으면 됌), AppDelegate(하나만 만들어 두고 사용하는..) 등

 

  아까 우리가 알아본 UserDefault 도 사실 싱글톤 패턴으로 구현된 클래스다. 그래서 우리가 여기에 값을 저장하고 앱 전체에 걸쳐 사용할 수가 있는 것이다.

 

그럼 왜 이것을 사용해야 할까?

 

- 바로 클래스의 인스턴스를 하나 이상을 가지는게 문제를 발생시킬 때 싱글톤 패턴을 사용하면 된다.

 

무엇을 조심해야 할까?

 

- 싱글톤 패턴에서 가장 쉽게 생기는 문제는 과다 사용(= 남용)의 문제다. 여러분이 싱글턴 패턴을 사용해야하는 유혹에 마주했을 때, 한번쯤은 여러분의 문제를 해결할 다른 방법이 있는지 찾아보는 것을 먼저 고려해 볼 것을 추천한다. 

 

예를 들어보면... 여러분이 단순히 하나의 뷰 컨트롤러에서 다른 뷰 컨트롤러로 정보를 단순히 전달한다고 하면, 싱글턴은 적절하지 않을 수 있다. 이 경우에는 이니셜라이저나 프로퍼티를 통해서 전달하는 것이 맞다고 본다.

 

'항상' 메모리에 상주한다는 것을 잘 기억하자!!

 

 

 

자 그러면 AVSpeechSyntheSizer 를 싱글턴 패턴으로 구현해보자.

진짜 단순하다;; 별로 말할게 없다;

 

 

파일을 하나 만들어주고...

 

다음과 같이 만들어주면 된다. static 키워드가 앞에 붙으면 이는 '타입 프로퍼티' 를 나타낸다.

아무튼 저렇게 타입 프로퍼티에 클래스의 인스턴스를 할당해주면 끝이다.

 

처음에 싱글턴을 배웠을 때는 진짜 왜 저게 의미가 있는건지 몰랐는데... 지금 생각해보니 꼭 필요한 부분이었다.

 

자 이제 뷰 컨트롤러에 싱글턴으로 구성한 AVSpeechSynthesizer 를 선언해주고 만약 뷰를 벗어났을 때, 음성이 실행중인 경우 즉시 중단하도록 선언했다. 그리고..

 

뷰 컨트롤러의 컬렉션 뷰 셀 파일에도 동일한 싱글턴 AVSpeechSynthesizer 를 선언하고

기존의 AVSpeechSynthesizer 로 선언되어있던 부분을 모두 싱글턴으로 교체했다.

 

결과는??? 아까는 작동되지 않던 발음 정지가 잘 작동한다!!! 굿굿

 

오늘은 여기까지 하겠습니다.

 

 

 

 

 

아 !! 발음 속도를 설정하는 뷰 컨트롤러는 싱글턴으로 구성되지 않았는데, 그 이유는

딱히 이 뷰 컨트롤러에서 싱글턴으로 구성하지 않아도 되었기 때문입니다. 싱글턴을 남발하면 좋지 않자나요...!

 

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함