짧은인사, 하루의 사건, 나의 행동
ToDo
✅ udemy swiftUI강의
✅ 운동
✅ 나태한 나를 반성하기.
흠 오늘은 어제 유데미 강의를 보며 클론한 코드를 다시 하나씩 뜯어보며
사용된 내용들을 잘근잘근 씹어서 삼켜보도록 하겠습니다..
배운점
Hacker News를 볼수있는 간단한 앱을 클론 했습니다만,,~~
networking, URLSession, Json decode등을 알수 있었쥐만,,,~~
네트워킹 부분에서 https://news.ycombinator.com/ 의 제목, id 등등을 가져와야 했습니다.
이 과정에서 항상 썼던
class NetworkManager: ObservableObject {
@Published var posts = [Post]()
func fetchData() {
if let url = URL(string: "https://hn.algolia.com/api/v1/search?tags=front_page") {
let session = URLSession(configuration: .default)
let task = session.dataTask(with: url) { data, response, error in
if error == nil {
let decoder = JSONDecoder()
if let safeData = data {
do {
let results = try decoder.decode(Results.self, from: safeData)
DispatchQueue.main.async {
self.posts = results.hits
}
} catch {
print(error)
}
}
}
}
task.resume()
}
}
}
위의 fetchData()의 함수부분을 생각없이 코드를 집어넣었지만 한줄 한줄 뜯어 보다보니, 잊고있었던
async await의 개념을 공부하게 되었습니다.
async await을 공부하기 위해 이 블로그를 보며 공부를 하는 중이었지만,, 처음 보는 부분이라 이해가 잘 되지 않더라구요..
그래서! 기억난 async swift에서 발표하신 내용을 확인후 다시 블로그를 보며 공부 했습니다...
(진짜 이 발표 이해 굳굳으로 됨... 발표도 그렇고 블로거 수진님...정말 캄사함다.. 저도 블로그 짜집기 하며 정리를 해보겠슴다..)
DispatchQueue.main.async
Swift의 코드는 한줄의 코드가 문장처럼 읽히게 작성 한다라고 어디서 주워 들었던것 같네요..ㅎㅎ
(궁금하면 다시 코드 컨벤션을 찾압 보겠습니다.)
하튼 DispatchQueue 큐로 보낸다는 뜻인것 같군요.
main 메인 으로 보낸다는것 같군요.
async 방식으로 한다는것 아닐까요?
메인 디스패치큐에 비동기로 task를 보낸다는것 같군요!!
네... ~~인것 같아요 ㅋㅋ
이글은 누구에게 async await을 알려주는 글이 아닌 오로지 저의 이해를 위한 글이니 다른
사람에 편의는 봐주지 않겠습니다..(하하..봐줘,,)
비동기(async)
메인 스레드가 자기한태 쌓여있는 다음 일을 실행한다.. 다음 라인을 실행한다 라구요..
queue에 보낸 작업은 생각하지 않고 바로 그 다음일을 한다 입니다..
동기(sync)
queue에 보낸 작업이 완료 될 때까지 기다린 후 다음 줄로 넘어갑니다.
queue.async { task } 또는 queue.sync { task }로 task를 queue로 보냈습니다.
queue에 쌓여있는 task들을 다른 스레드에 넣어 일을 해야겠습니다.
------------------------------------------------------------------------------
여기서 두개의 큐의 방식이 나오게 됩니다.
Serial(직렬)
serial queue는 한대의 스레드에서 처리하는 큐 입니다.
(여러개의 스레드가 있어도 한개의 스레드만 사용을 하는것 입니다.)
Concurrent(동시)
concurrent queue는 여러개의 스레드에서 처리하는 큐 입니다.
두개의 큐 방식중 어떤것을 사용해야 하는가??( 난 몰루? 항상 빠른것이 짱임 ㅋㅋ)
순서가 중요한 작업이면 serial queue, 순서가 중요하지 않고 빨리 끝내야 하는 작업이면 concurrent queue방식을
사용 해야 한다고 하네요 껄껄
async sync, serial concurrent를 두개씩 묶어 생각하지 않고 별도의 개념으로 받아드려요,,,
async, sync -> 작업을 보내는 시점에서 기다릴지 말지에 대해 다루는것
serial, concurrent -> 큐에 보내진 작업을 여러개의 스레드에 보낼지 한개의 스레드로 보낼지에 대해 다루는 것
Dispatch Queue의 종류
1. main Queue
: 오직 한개만 존재하는 큐, Serial의 특성을 가짐, 이곳에 할당된 task는 메인 스레드에서 처리(UI 업데이트 내용 처리)
2. global Queue
: concurrent의 특성을 가진 큐, QoS(qualith of service)에 따라 여러개의 종류로 나뉨.
QoS(qualith of service) 6종에 대해 또한 알아야 겠습니다.
- userInteractive
사용자와 직접 상호작용 하는 작업 ( UI업데이트, 애니메이션 등)
메인스레드에서 처리하면 많은 로드가 걸리는 작업을 userInteractive에서 처리하여
바로 동작하는 것처럼 보이게함.
- userInitiated
클릭과 같은 즉각적인 결과가 필요한 작업(저장된 문서열기 등..)
userInteractive보다는 조금 오래걸리고 유저가 어느정도 인지하고 있음
- default
일반적인 작업
- utility
progress bar와 함께 길게 싱행되는 작업 (데이터 다운로드 등,,,)
- background
유저가 인지하지 않는 시간이 덜 중요한 작업(동기화 및 백업 등,,,)
- unspecified
Qos 정보가 없음 을 나타냄. (거의 사용할일 없다십니다 하하)
3. custom Queue
: 커스텀으로 생성, 디폴트로 Serial의 특서을 가진 큐 but Concurrent로 설정이 가능하다.
앞으로의 계획선언
요즘 공부에대한 목적을 잃고 다시 나태지옥에 빠지는 듯한 기분이 듭니다..
그래서 ios공부와 같이 플러터또한 시작해볼까 합니다.. 핳하...
뭐라도 하면서 흥미를 붙여야 좋지 않을까 합니다 하하..
'TIL' 카테고리의 다른 글
TIL_20240110 Swift_AppSandbox, NSCoder (0) | 2024.01.10 |
---|---|
TIL_20240109 Swift_SingletonPattern (0) | 2024.01.09 |
TIL_20231226 (0) | 2023.12.26 |
TIL_20231223 (0) | 2023.12.23 |
TIL_20231221 (0) | 2023.12.21 |