개인 프로젝트 중에 SceneDelegate에서 API 통신 후에 값을 계산하고 계산된 값을 MainTabBarController -> MainViewController 순으로 넘겨주는 코드가 있다. 그런데 API 통신 및 계산이 완료되지 않은 시점에 MainTabBarController, MainViewController가 호출이 되어서 넘겨준 값을 viewDidLoad에서 가져올 수가 없게 되었다. 이때 필요한게 비동기 처리다.
결과적으로 SceneDelegate에서 API 호출 및 리턴값으로 계산한 함수 실행이 끝난 시점에 MainTabBarViewController와 MainViewController를 부를 수 있도록 비동기처리를 해줘야 하는 것이다.
동기
메인스레드에서 쭉 실행이 되는데,
중간에 API를 받아올 때 딜레이가 걸리기 때문에 그 뒤 처리를 아무것도 못하는 문제가 생긴다.
비동기
야, 메인스레드 너는 너 갈길 가라
나는 API호출 내 갈길 간다
메인스레드에서 쭉 실행되며 갈 때, 중간에 API가 호출되고 응답이 올 때,
메인스레드는 API 통신과 관계 없이 계속 진행이 되고있고,
API 호출은 완료되는 시점에 따로 처리해주는 것
요즘 앱은 대부분 서버와 통신을 하기 때문에 비동기 기술이 중요하다.
코드 예제
override func viewDidLoad() {
super.viewDidLoad()
print("viewDidLoad 호출")
getUser{ name in
// getUser가 완료되어서 doneCallUser하면,
// 넘긴 파라미터 name 데이터를 받아올 수 있고
// 이 코드가 실행됨
print("\(name) 받아옴")
}
}
func getUser(doneCallUser: @escaping(String) -> ()) {
let userName: String
// API호출 코드
userName = API 호출 완료후 받은 데이터
prnt("API 호출 완료함")
doneCallUser(userName)
}
결과
viewDidLoad 호출 // viewDidLoad가 가장먼저 호출되지만,
API 호출 완료함 // getUser가 함수가 실행 완료되면,
다동 받아옴 // completion block 내부가 실행됨
'[iOS] App Development' 카테고리의 다른 글
[iOS] FireStore에서 데이터 정렬하기 : 쿼리방법(order by), 내림차순 (2) | 2022.01.08 |
---|---|
[iOS] SwiftUI : 한 사이즈의 서로 다른 디자인 위젯 여러 개 만드는 법 (2) | 2022.01.08 |
[iOS] SwiftUI 로 개발한 위젯에 Custom Font 사용하는 법(+폰트인식 못할 때) (0) | 2021.12.28 |
[iOS] 다이어리 앱 개발 : 테이블뷰에서 선택한 Row의 파이어스토어 문서 documentID값 아는법, 주의할 점 (0) | 2021.12.27 |
[iOS] 다이어리 데이터 FireStore CRUD 방법 / 모델 구조 / 실시간 업데이트하는 법 / Timestamp to NSDate 타입변경 (0) | 2021.12.23 |