# 딴지 스터디
- [Notion](https://www.notion.so/ef0df26bc2c247d3840b9486dc862b9a)
# 8일차 스터디
12.9
🧑💻 공부 주제
- [Inheritance - Subclassing](https://docs.swift.org/swift-book/LanguageGuide/Inheritance.html)
⭐️ 공부하면서 나눴던 이야기와 질문들
## 상속의 종류

## 상속
: 하위 객체가 상위 객체의 프로퍼티, 메서드 등을 상속 받아 사용할 수 있는 것.
## 서브 클래싱
: 이미 구현되어 있는 객체를 상속받는 것
## 서브 타이핑
: 구현 되어 있는 인터페이스를 구현하는 것. Protocol!
---
# 7일차 스터디
12.8
🧑💻 공부 주제
- [WWDC 2018 - High Performance Auto Layout](https://developer.apple.com/videos/play/wwdc2018/220/)
---
# 6일차 스터디
12.7
🧑💻 공부 주제
- [UIView](https://developer.apple.com/documentation/uikit/uiview)
- Threading considerations부터
⭐️ 공부하면서 나눴던 이야기와 질문들
## 왜 main 스레드에서 뷰를 그려야 하는데?
- 하나의 드로잉 사이클에서 그려야하는 뷰가 그려져야 하기 때문이다.
[[ios] setNeedsLayout vs layoutIfNeeded](https://baked-corn.tistory.com/105)
## transform이 무엇인가?
- 오토레이아웃의 제약 없이(ios 8.0 이상) center를 기준으로 크기 수정과 회전이 가능한 애니메이션
## `UIView`의 SubClassing을 하는 경우는 뭘까?
- 필요한 기능이 없는 경우에만 서브클래싱을 해라.
- But 웬만한건 다 있으니 먼저 찾아봐라
이 차이 뭔지 아심?
for은 프린트 하는 동안 다른 뷰를 그릴 때 사용
프린트 하는 동안?????
draw(_:) - Implement this method if your view draws custom content. If your view does not do any custom drawing, avoid overriding this method.
draw(_:for:) - Implement this method only if you want to draw your view’s content differently during printing.
- 아래거는 그리는 도중에 바꾸려고 할 때 아닐까요?
아하 그렇네용 감삼당
https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/Multithreading/RunLoopManagement/RunLoopManagement.html
## Main RunLoop?
[런루프 넌 누구야..](https://babbab2.tistory.com/68)
## main 스레드에서 뷰를 그려줘야 하는 이유?
우리는 먼저, UIKit이 Thread-safe하지 않은 것에 대한 이유를 알아야 한다.
그리고 그 전에 나는 Thread-safe가 무슨 말인지 모른다.
### Thread-safe란?
어떤 데이터에 여러 스레드가 동시에 접근을 시도하더라도, 각 스레드에서의 수행 결과가 올바로 나오는 것.
하지만 UIKit은 Thread-safe하지 않기 때문에, 한번에 `하나의 스레드만 접근이 가능하도록 처리`하여 Race condition 문제없이 사용할 수 있도록 구현하였다.
### Race Condition이란?
하나의 값에 여러 스레드가 동시에 접근하는 경우.
예를 들어 값을 변경하는 과정과 값을 불러오는 과정이 동시에 이루어질 경우, 어떤 값을 가져올지 확실하지 않다.
자, UIKit은 Thread-safe하지 않다고 한다.
만약 safe했다면, main Thread에서 UI를 serial하게 처리하지 않았을 것이다?
그렇겠지..? 근데 이건 결과론 아닌가..?
### 왜?
UIKit의 대부분 components들은 nonatomic(서로 연결된)상태로 구현되어있다고 한다. 이는 Thread-safe하지 않다는 것을 의미한다고 한다. 그래..?
또 UIKit의 모든 속성을 Thread - safe하게 디자인 하는것은 너무 방대하기 때문에 사실 불가능하다고 한다. 그럴 수 있지
그리고 이건 좀 억지처럼 느껴지지만 [애플에서 의도한 디자인 결정](https://medium.com/@duwei199714/ios-why-the-ui-need-to-be-updated-on-main-thread-fd0fef070e7f#:~:text=the%20same%20things%3A-,It%E2%80%99s%20a%20conscious%20design%20decision%20from%20Apple%E2%80%99s%20side%20to%20not%20have%20UIKit%20be%20thread%2Dsafe,-.%20Making%20it%20thread)이다. 라고도 한다..내맴이다~
이유는? UIKit을 굳이 Thread Safe하게 만들려면 성능 면에서 많은 것을 포기해야하고 작업이 느려지기 때문이라고 한다.
만약 각각 다른 스레드에서 접근이 가능하고, 각 스레드에서 변경이 이루어지면 UI에서 이루어져야할 작업이 꼬일 수 있다. `(예를 들어, 백그라운드 스레드가 뷰를 제거하고 이 스레드의 run loop가 끝나지 않은 경우, 동시에 사용자가 제거될 뷰를 탭한다면, 이 터치 이벤트를 어떻게 처리할 것이고 응답할 스레드는 무엇일까?)` ← serial인 이유 아닐까
이러한 문제들을 해결하는 가장 쉽게 해결하는 방법이 `바로 모든것들을 하나의 큐에서 Serial하게 처리`하는 것.
앱의 Entry Point라고 할 수 있는 main 함수가 실행되게 되면, **UIApplicationMain**함수가 실행되게 되고, **UIApplication**객체가 생성된다. **UIApplication**은 메인 스레드에서 Main Run Loop를 호출해, Run Loop를 초기화하고, 그것은 앱의 Life Cycle 동안 대부분의 사용자 이벤트를 처리한다.

또한 모든 뷰의 변경 사항은 즉시 변경되지 않으며, `현재의 Run Loop 끝에서` 다시 그려집니다. 이를 통해서 앱이 모든 뷰에 대한 모든 변경 사항을 처리할 수 있다는 것을 보장할 수 있으며 `모든 변경 사항이 동시에 활성화`될 수 있다. 이것을 우리는 **"View Drawing Cycle"**이라고 부른다.
동시에 변경하는 이유
1. 충돌 문제
- **`백그라운드 스레드에서 UI를 업데이트한다고 가정`해보자!**
각 스레드마다 자체 Run Loop가 있기 때문에 스마트폰을 회전했을 때, 레이아웃을 새로 고쳐야 할 때 문제가 발생할 수 밖에 없습니다. **모든 `변경 사항을 동시에 적용할 수 없으므로` 스마트폰을 회전시키고 나서 몇 개의 뷰는 회전하지 않은 것을 보게 될 수도 있습니다.**
1. 성능의 문제
- iOS가 그림의 그리는 Rendering Process(*CoreAnimation -> Render Server -> GPU -> Present*)가 있는데, 여러 Thread에서 UI 업데이트를 하게 된다면, 각기 다른 뷰 계층 구조를 인코딩하여 렌더 서버로 전송할 것이고, 이에 따라 GPU 에 많은 렌더링 요청을 보내게 됨.
- → 렌더링은 시스템 리소스가 많이 드는 작업이므로 GPU 가 이를 처리할 수 없어 심각한 문제가 발생
참고 링크:
[깔끔한 정리본 블로그](https://inuplace.tistory.com/1016)
[Thread-safe, RaceCondition, runloop, drawingCycle](https://velog.io/@leeyoungwoozz/iOS-DispatchQueue.main.async)
[medium 영문 글](https://medium.com/@duwei199714/ios-why-the-ui-need-to-be-updated-on-main-thread-fd0fef070e7f)
[GCD와 UI를 Main에서 처리하는 것의 연관성](https://sujinnaljin.medium.com/ios-%EC%B0%A8%EA%B7%BC%EC%B0%A8%EA%B7%BC-%EC%8B%9C%EC%9E%91%ED%95%98%EB%8A%94-gcd-6-ae3d0762ae6e)
---
# 5일차 스터디
12.6
🧑💻 공부 주제
- [UIView](https://developer.apple.com/documentation/uikit/uiview)
- Animate views까지
⭐️ 공부하면서 나눴던 이야기와 질문들
## 결석해서 모름...(건디)
---
# 4일차 스터디
12.5
🧑💻 공부 주제
- 인터넷이 느린 환경에서의 앱은 어떤 방향으로 개발되어야 하는가?
⭐️ 공부하면서 나눴던 이야기와 질문들
- [회의록](https://hackmd.io/@lSy_5er7SPayADf7TjKoyg/HygACs9vj)
## 인터넷이 느린 국가의 앱은 콘텐츠 로딩시 어떻게 해야할까?
- 저해상도의 라이트 모드를 만들어 사용자가 선택할 수 있게 한다.
---
# 3일차 스터디
12.2
🧑💻 공부 주제
- [HIG-Alerts](https://developer.apple.com/design/human-interface-guidelines/components/presentation/alerts/)
- [HIG-Action sheets](https://developer.apple.com/design/human-interface-guidelines/components/presentation/action-sheets) - 선택사항
⭐️ 공부하면서 나눴던 이야기와 질문들
## 뭔가 있었던 것 같다.
-
---
# 2일차 스터디
12.1
🧑💻 공부 주제
- [UIAlertController](https://developer.apple.com/documentation/uikit/uialertcontroller)
⭐️ 공부하면서 나눴던 이야기와 질문들
## 뭔가 있었던 것 같다.
- 하하...
얼럿에 텍스트필드 추가 가능하다.
각 텍스트 필드를 저장하는 프로퍼티가 있어서 참조가 계속 유지된다.
얼럿 클래스는 서브클래싱 하면 안된다. 그 기능 자체로만 사용해야 하기 때문
서브클래싱 이란? (토론(트롤) 시작)
preferredaction 취소처럼 강조표시 해줌
취소 액션이 있으면 취소 액션은 기본 처럼 보여짐. (애종 프로젝트)
preferredaction 액션시트에서는 안된다. 왜?
(이거 제 질문이었는데 깜빡하고 그때 말 안했어요 ㅎㅎ..)
---
# 1일차 스터디
11.30
🧑💻 공부 주제
- [Entering data](https://developer.apple.com/design/human-interface-guidelines/patterns/entering-data/)
⭐️ 공부하면서 나눴던 이야기와 질문들
## 뭔가 있었던 것 같다.
- 하하...
텍스트필드에 값을 넣을 때 다이내믹 하게 넘버포맷터 사용하면 좋다.