비동기와 네트워킹
비동기를 활용하여 서버로부터 데이터를 받아오는 네트워킹에 대해 정리해봅니다.
스레드란?
스레드(Thread)는 컴퓨터 프로세스 내에서 실행되는 실행 흐름의 단위
프로세스는 운영체제로부터 자원을 할당받아 실행 중인 프로그램의 인스턴스를 나타내는데,
각각의 프로세스는 하나 이상의 스레드를 가질 수 있음
스레드 종류
메인 스레드(Main Thread)
애플리케이션의 주요 인터페이스 및 UI 업데이트를 담당하는 스레드입니다.
(UI 요소의 변경은 메인 스레드에서 수행)
백그라운드 스레드(Background Threads)
메인 스레드 이외에 동시에 작업을 수행하기 위해 생성되는 스레드를 말합니다.
주로 작업을 분산하거나 병렬로 처리할 때 사용
동기 (Synchronous) vs 비동기 (Asynchronous)
동기(Sync)
작업이 순차적으로 실행되는 것
한 작업이 끝날 때까지 다음 작업이 기다
리며,
작업이 순서대로 실행
비동기(Async)
작업이 별도의 스레드 또는 백그라운드에서 실행되며,
다른 작업을 기다리지 않고 동시에 실행
작업이 완료되면 콜백(callback) 또는 완료 핸들러(completion handler)를 통해 결과를 처리
(메서드 호출 순서대로 작업이 완료된다는 것은 미보장)
직렬(Serial) vs 동시(Concurrent)
직렬(Serial)
분산처리 시킨 작업을 오직 한 개의 쓰레드에서만 처리하는 것
(ex. A 쓰레드에서 4개의 작업을 분산처리 시켰는데, B 쓰레드에서만 처리하는 것)
동시(Concurrent)
몇 개의 쓰레드로 분산할지는 시스템이 정하지만,
시스템이 정한 여러개의 쓰레드로 분산 처리
작업들이 각자 독립적이지만 유사한 작업들일 때 굉장히 유용
(ex. 테이블뷰 셀 같은 것들을 서버에서 받아오는 것)
DispatchQueue
Grand Central Dispatch(GCD)는 iOS, macOS 등의 Apple 플랫폼에서
멀티스레드 프로그래밍을 간단하고 효율적으로 구현하기 위한 기술이며,
다양한 작업을 관리하고 실행하기 위한 강력한 API를 제공 및 병렬성 활용
GCD의 특징
큐(Queue) 기반의 작업 관리
GCD는 큐를 사용하여 작업 관리
작업을 세분화 및 실행할 큐에 따라 작업의 속성을 결정
간편한 비동기 작업 처리
GCD를 사용하면 비동기적 작업 수행
(프로그래머가 별도의 스레드를 관리하지 않아도 되어 개발이 편해짐)
큐의 종류에 따른 다양한 동작 방식
GCD에는 Serial Queue와 Concurrent Queue가 존재.
Serial Queue는 작업이 순차적으로 실행되며,
Concurrent Queue는 여러 작업이 동시 실행가능
콜백을 통한 작업 완료 처리
작업이 완료시 콜백(closure)을 사용하여 결과를 처리
QoS(Quality of Service) 지원
GCD는 각 큐에 대한 우선순위 설정을 지원하여
시스템이 작업을 적절히 관리 및 최적의 성능을 유지
DispatchQueue.main
- 주로 앱의 UI 업데이트 및 관련된 작업을 처리에 사용
- 메인 스레드에서 동작, 주로 사용자 인터페이스(UI)를 업데이트 및 사용자와의 상호작용 처리에 사용
(UI 업데이트나 사용자 이벤트 처리와 같이 메인 스레드에서 실행되어야 하는 작업들은 반드시 DispatchQueue.main을 통해 실행)
- 메인 스레드는 UI와 관련된 작업들을 담당하기 때문에, 부주의 사용시 UI의 응답성 떨어짐
(긴 작업이 메인 스레드에서 실행되면 앱이 멈추거나 뚝뚝 끊기는 현상이 발생)
DispatchQueue.global()
전역(백그라운드) 스레드에서 작업을 처리하는데 사용
여러 스레드에서 동시에 실행되는 비동기 작업을 처리할 때 유용
전역 DispatchQueue에서 async 또는 **sync**를 사용하여
작업을 추가하면, 해당 작업은 백그라운드에서 실행
// 동기적으로 실행되는 작업
DispatchQueue.global().sync {
print("Synchronous Task")
}
// 비동기적으로 실행되는 작업
DispatchQueue.global().async {
print("Asynchronous Task")
}
// 백그라운드에서 비동기 작업 실행
DispatchQueue.global().async {
// 여기서 백그라운드에서 실행될 작업을 수행합니다.
for i in 1...5 {
print("Background Task \(i)")
}
// 작업이 완료되었음을 메인 스레드로 알립니다.
DispatchQueue.main.async {
print("Background Task Completed, Updating UI")
// UI 업데이트 등을 수행할 수 있습니다.
}
}
/*
위의 예시는 DispatchQueue.global().async를 사용하여 백그라운드에서 비동기 작업을
실행하는 코드입니다. 이 코드는 백그라운드에서 1부터 5까지의 작업을 실행한 후,
해당 작업이 완료된 후에 메인 스레드에서 UI 업데이트를 실행합니다.
*/
네트워킹
- 네트워킹은 주로 URLSession을 사용하여 수행
- 네트워킹은 외부 서버 또는 인터넷 리소스와 데이터를 주고받는 작업을 의미
(비동기적인 방식으로 처리하는 것이 일반적)
- URLSession을 사용하여 네트워크 요청시 기본적으로 비동기 방식으로 처리
(해당 코드 블록이 네트워크 요청을 보낸 후 바로 다음 코드로 진행, 응답이 도착하면 그에 맞게 처리)
// URLSession의 dataTask 함수 정의
func dataTask(
with url: URL,
completionHandler: @escaping (Data?, URLResponse?, Error?) -> Void
) -> URLSessionDataTask
/*
dataTask 이라는 함수를 정의하고, url이 있고 completionHandler 라는것이 있는데
이는 콜백과 상당히 유사합니다. completion 완료가 된다면 Handler 그것을 조작하겠다는 것을 말합니다.
즉, 완료가 된 데이터들이 "(Data?, URLResponse?, Error?)" 이곳에 담기게 되는 것 입니다.
비동기 이기 때문에 "@escaping"가 붙는 것 입니다.
*/
// 네트워크 작업을 처리할 함수
func fetchData() {
if let url = URL(string: "https://jsonplaceholder.typicode.com/posts/1") {
let task = URLSession.shared.dataTask(with: url) { data, response, error in
/*
let url이 with: url 로 넣어줍니다.
"{ data, response, error in" 여기부분은 요청이 되고 바로 실행이 되는 것이 아닌
콜백이 오면 실행이 되는 것입니다. 즉, 완료가 되면 실행되는 것을 말합니다.
*/
// 네트워크 작업 완료 후 실행될 코드 (비동기적으로 실행)
if let error = error { // error도 옵셔널로 들어오기 때문에 error가 들어오면 종료됩니다.
print("Error: \(error.localizedDescription)")
return
}
if let httpResponse = response as? HTTPURLResponse { // as?:다운케스팅
print("Status code: \(httpResponse.statusCode)")
}
if let data = data { // 옵셔널로 와서 옵셔널 바인딩을 해줍니다.
do {
// JSON 데이터 파싱
let json = try JSONSerialization.jsonObject(with: data, options: [])
if let jsonDict = json as? [String: Any] {
// 파싱된 데이터 활용
print("Received JSON data: \(jsonDict)")
}
} catch {
print("JSON parsing error: \(error.localizedDescription)")
}
}
}
task.resume() // 네트워크 작업 시작 (비동기적으로 실행됨)
}
}
// fetchData 함수 호출
fetchData()
'IOS > Swift-Study' 카테고리의 다른 글
[Swift-Study] 심화 문법종합반 2주차 5일차 정리 - RxSwift 맛보기 (0) | 2024.03.28 |
---|---|
[Swift-Study] 심화 문법종합반 2주차 5일차 정리 - Combine 맛보기 (0) | 2024.03.28 |
[Swift-Study] 심화 문법종합반 2주차 5일차 정리 - 제네릭 (2) | 2024.03.27 |
[Swift-Study] 심화 문법종합반 2주차 4일차 정리 - 확장 (0) | 2024.03.27 |
[Swift-Study] 심화 문법종합반 2주차 4일차 정리 - 프로토콜 (0) | 2024.03.27 |