RC 4th WEEK : Multi-Thread

YJ·2023년 1월 16일
0

라이징 캠프 13기

목록 보기
8/11
post-thumbnail

복습을 위한 질문

Q1. Thread는 무엇인가?

한 프로세스 내에서 동작되는 여러 실행의 흐름

Q2. 싱글스레드 vs 멀티 스레드

싱글 스레드

하나의 프로세스에서 하나의 스레드 실행

멀티 스레드

하나의 프로그램을 여러 개의 쓰레드로 구성하여,

각 쓰레드마다 하나의 작업(Task)씩 처리하도록 하는 것

Q3. 동기 / 비동기 그리고 직렬 / 동시 가 무엇인가?

동기

다른 쓰레드로 작업한 걸 보내고, 작업이 끝날 때까지 기다리는 것

그 작업이 끝나야 다른 작업이 시작할 수 있음

비동기

다른 쓰레드로 작업한 걸 보내고, 다른 작업을 수행하는 것 동기처럼 기다리지 않아도 됨


직렬

단 하나의 쓰레드로만 작업을 보내는 대기열

동시

여러개로 다른 쓰레드로 작업을 보내는 대기열

직렬 → 순서가 필요한 일을 처리할 때 사용

동시 → 독립적이지만 유사한 작업을 처리할 때 사용

멀티스레딩→ 비동기

Q4. 탈출 클로저란??(현업에서 많이 사용하고, 서버 통신할 때 유용)

정의

탈출클로저는@escaping이 붙어있는 클로저임

클로저가 함수로부터 '탈출'한다는 것은 해당 함수의 인자로 클로저가 전달, 함수가 반환된 후 실행됨

탈출 클로저를 사용하는 이유

1) 함수 내부의 클로저 인자를 외부에서 사용가능

2) 함수 간 실행 순서를 고려할 수 있음

Q4-1. closer 안에 self를 써야하는 이유, 순환참조 (면접 단골질문!!!!!)

순환참조

두 가지 이상의 객체가 서로에 대한 Strong Reference(강한 참조) 상태를 가지고 있을 때 발생하며, 순환 참조가 발생하게 되면 서로에 대한 참조가 해제되지 않기 때문에 메모리에서 유지되며 이로 인해 메모리 릭이 발생하게 됨.
이러한 순환 참조를 해결하기 위해 weak, unowned reference가 사용

closer 안에 self를 써야하는 이유

self를 언급하는 escaping closure는 self가 클래스의 인스턴스를 가리킬 때 주의해야함

Escaping closure에서 self를 capturing 하는 것은 강한 참조 사이클을 생성하기 쉬움.

일반적으로, 클로저는 클로저의 body 안에서 변수를 사용함으로써 값을 획득하지만, 이 경우에는 명시적으로 해줄 필요가 있음.

만약 self를 획득하고 싶다면, 사용할 때 self를 명시적으로 적어주거나 클로저의 획득 리스트에 self를 포함.

명시적으로 self를 적으면 의도를 표현할 수 있고, 참조 사이클이 없는 것을 확인할 수 있게 리마인드 할 수도 있음.

[이번주차 자료조사 참고한자료]

iOS) 프로세스(Process) vs 쓰레드(Thread)
[OS] 싱글스레드, 멀티스레드의 의미
[Swift] 동기/비동기, 직렬/동시의 차이
[iOS] 동시성 프로그래밍 - 동기/비동기 , 직렬/동시

Concurrency and Grand Central Dispatch in Swift (GCD)
[Swift] 탈출클로저(Escaping closure) 이해하기
[iOS] 클로저(Closure) 순환 참조 문제
[iOS] @escaping Closure(탈출 클로저)에 대한 고찰 with Network
[Swift] 순환참조에 대해 알아보자 (feat. strong, weak, unowned reference)
Swift - Escaping clousre, 탈출 클로저


1. 이번주차 과제 수행하기

spritekit 사용은 하지 말고 스레드를 이용해서 과제하라고 하셨다!!!!!!!

추천해주셨던 게임은

타이쿤 게임인데

붕어빵, 카드 뒤집기, 슈의 라면 가게, 리듬게임 등등이 있었음…

붕어빵 뒤집기를 하려고 한다

참고한 리얼게임

붕어빵만들기게임 타이쿤
붕어빵만들기게임 타이쿤

중독성 있는데.....!!

1. 1 UI 구현 틀 잡기

물론 처음 계획한 거 대로 흘러가지 않는다…
모든 것이 그렇다…ㅎㅎ

1. 2 UI 구현 시작

  1. 가로로 화면 구현할 거기 때문에 가로로 고정하는 법 구글링

스토리보드에 가로로 화면 전화를 하려면 스토리보드 밑에 화면 가로로 전환하는 버튼이 있으니 그걸 누르면 됨!

[참고한 자료]

[iOS / Swift] 세로모드, 가로모드 고정하기

  1. 크게 4개의 View 구현

디자인 수정 발생

UI 구현만 하다가는 시간이 너무 지체될 것 같아 UI 기능 구현 단축

xib 파일 따로 만들어서 저장

일단 대강 UI Autolayout잡아두고 기능 구현까지 생각해놓음

1. 3 UI 관련 코드 작성하기

UI 보완과 코드 오류 해결 중….

중간 시뮬레이터
https://s3.us-west-2.amazonaws.com/secure.notion-static.com/a8ef8d2f-5db9-40c2-a14e-f4c51737e11c/Simulator_Screen_Recording_-_iPhone_13_Pro_-_2023-01-12_at_03.47.28.mp4?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45EIPT3X45%2F20230116%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20230116T134426Z&X-Amz-Expires=86400&X-Amz-Signature=25e589689a173f7b7b853a2db5f39dd5fd5b572082dc3d7d902533c6cf237bcc&X-Amz-SignedHeaders=host&response-content-disposition=filename%3D%22Simulator%2520Screen%2520Recording%2520-%2520iPhone%252013%2520Pro%2520-%25202023-01-12%2520at%252003.47.28.mp4%22&x-id=GetObject

[오류]

[오류] Could not insert new outlet connection 해결법
[Swift 5] ViewController has no initializers
Label hide very slow
(내가)자주 겪는 오류들: #this class is not key value coding-compliant for the key
Programming Log: [iOS] "loaded the ~ nib but the view outlet was not set." 문제
iOS 레이아웃이 깨졌을때 할 수 있는 방법?!

breakpoint 어쩌구저쩌구 하더니 결국 낮은 버전 아이폰으로 돌렸더니 작동함…^^

[기능 구현시 참고할 사이트들]

Xcode 기능 - 화면전환하는 방법 / change ViewController

1. 4 UI 수정 보완 및 코드 오류 해결

UI 보완 및 코드 오류 해결

UI 보완 완료

코드 보완중

Label이 변해야하는데 label안에 있는 텍스트가 안 변함

[IOS] UIButton의 text를 가져와 사용하기

[코드오류]

[Swift] UIButton의 title을 확인하는 방법(강제 추출, 옵셔널 바인딩)

아까까지만 해도 잘 돌아가던 코드에 오류가 생김…

스코어 점수 올라가는 거 코드 작동 안됨

결과 창 넘어가는 코드 작동 안됨

이외에 변수 선언 코드 오류 엄청 많이 났음 왜임???

이외에도 오류가 너무 많이 나서 구글링을 엄청 했다

1. 5 구현한 점, 구현 못한 점, 시뮬레이터

구현한 점

게임 메인 타이머 구현

붕어빵 이미지 변화하면서 상태 변화

붕어빵 지급 후 새로 붕어빵 주문 받기

붕어빵 order 받아서 → 붕어빵 굽고 → 붕어빵 지급

메인 타이머가 줄어들기는 하는데 아래 것들을 구현하지 못 해서 의미가 없어진 느낌

구현 못한 점

붕어빵이 탄 타이머 구현해서 하트 수 없애는 것

붕어빵이 탄 타이머 구현해서 하트 수 줄어들고 메인 타이머와 연관 지어서 결과 창으로 넘어가기

레이아웃 신경 썼는데 오류가 없었는데 깨져서 보완 필요(무조건)

오디오도 같이 나오게 하고 싶었는데…

아쉬운 점 및 다음 과제에서 보완해야할 점

꾸준히 시간 투자를 했었는데도 불구하고 내용에 대한 공부와 오류해결하는 데 시간을 다 쏟았음

그게 너무 아쉬웠고, 그동안 잘 되던 레이아웃이 다 깨져버린 상태로 구현되어서 여태 했던 게 다 의미가 없었나 싶었고 지금 이렇게 구현하는 게 맞나하는 의심까지 들었음

이미지 소스를 구할 수 없어서 내가 일일이 다 캡쳐하고 누끼뜨고 그 위에다가 이미지 만들어서 했는데 분명히

맞는 레이아웃임에도 불구하고 이렇게밖에 구현되지 못 해서 아쉽다…

타이쿤 게임 말고 다른 걸 했어도 이랬었을까…???

보완

무조건 UI는 마스터하고 라이징 테스트 들어가야하고

구현하는 점들은 조금 더 찾아보고 구현 꼭 해보고 싶음

시뮬레이터

iphone8 시뮬레이터
https://s3.us-west-2.amazonaws.com/secure.notion-static.com/9cb8c8fb-0307-41a4-a4bd-9b134a8b5c1d/Simulator_Screen_Recording_-_iPhone_8_-_2023-01-13_at_20.13.16.mp4?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45EIPT3X45%2F20230116%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20230116T134948Z&X-Amz-Expires=86400&X-Amz-Signature=e81b538d5e0af42f6659daf0a6ec7525a75440f3e6239663fe0374d8a004ebe5&X-Amz-SignedHeaders=host&response-content-disposition=filename%3D%22Simulator%2520Screen%2520Recording%2520-%2520iPhone%25208%2520-%25202023-01-13%2520at%252020.13.16.mp4%22&x-id=GetObject

나오지 못 했던 결과 창까지 이미지…남겨두고 갑니다…

내 깃허브 링크

GitHub - yeahzxnn/Fish-ShapedBunMakingGame: Multi-Thread를 이용한 붕어빵 게임 만들기

멘토님이 말씀해주시는 다른 과제들 보완할 점

1) 랭킹판 → userdefaults → 10위, 5위, 3위까지 보이게 한다거나 그런 부분들 구현

2) 중간에 queue에 직접적으로 접근해서 중간에 멈추기?가 가능한지????!!!!

다른 분들 답변…Finish = true를 만나면 안 튀어나오게 멈춰지는 게 가능했다!!!!!!

3) burntime 진행중일 때 type을 액션을 눌러서 true가 되면 return을 때리면

끝은 무조건 타게 해주고 → bool

4) 애니메이션 파일 → json파일 , 로티 주로 많이 쓴다

5) rootview 바꾼 다는 거 dismiss가 아니라 rootview를 홈으로 바꿔보는 거, 다시 처음으로 돌려보는 거(진짜 자주 쓰이는데, 코드 공부해놓기)

6) home으로 돌린다면 rootview바꾸는 걸로 연습하기

7) 로그인 서비스 → 토큰, 유저 고유만의 토큰 그게 있어야만…서비스 쓸 수 있음…..

원래 keychain으로 하지만…암호화만 빼면 user defaults(라이징테스트때 매우 도움된다욥)

멘토님이 말씀해주시는 내 과제 보완할 점

1) tap gesture 꼭 써보기(붕어빵 틀)

2) completion → 완료되었을 때 실행되는 부분들 dismiss → 다음 실행될 부분

배울점

감지만을 위한 view를 만들어서 겹쳐지게 인식되게

진짜 잘하셨따…..와우….너무 잘하셨따….많이 배워간다…나는 스린이…스린이..그잡채…

이번주차 과제 다짐
1) 이번주차 핵심 개념 -> 구현 꼭 해봐야함
2) 레이아웃 무조건 완벽하게
3) 스트레스 받지 말고, 실력향상을 위해 즐기는 거라 생각하기

profile
why not?!?!

0개의 댓글