[iOS] App Development

[iOS] 동기/비동기 처리, 컴플리션 블럭(Completion Block)

ddgoori 2022. 1. 1. 20:28

개인 프로젝트 중에 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 내부가 실행됨