IOS Swift 비동기처리란?
안녕하세요 YagSill 입니다.
오늘은 개발에 있어서 중요한 비동기처리에 대한 설명을 드리려고 합니다.
동기 처리 방식 (Synchronous)
동기처리방식 은 메인스레드 위에서 코드가 진행이 되다가 API같은것이 들어왔을 때 응답을 받기 전까지 진행되던 코드가 멈추고 API의 응답을 받고 난 후에 멈췄던 코드가 다시 진행되는 방식입니다.
비동기 처리 방식 (Asynchronous)
비동기처리방식 은 메인스레드 위에서 코드가 진행되다가 API같은것이 들어왔을 때 코드는 코드대로 진행이 되고 API통신은 통신대로 진행이 되는 방식입니다. 멈추지 않고 코드가 진행되다가 통신이 완료되었을때 결과값을 받는 방식이 비동기처리방식 입니다.
예제를 하나 만들어 보았습니답!
completionblock을 사용하여 비동기처리를 해봤습니다.
class ViewController: UIViewController {
@IBOutlet var MainTitle: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
KRProgressHUD.show()
print("ViewDidLoad 호출됨")
sayHI(completion: ) { result in
print("completioblock으로 넘겨받은 값 = \(result)")
KRProgressHUD.showSuccess()
self.MainTitle.text = "비동기처리완료"
}
print("ViewDidLoad가 비동기처리 전에 호출 됨")
}
func sayHI(completion : @escaping(String) -> ()){
DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) { // Change `2.0` to the desired number of seconds.
// Code you want to be delayed
print("하이")
completion("메롱메롱")
}
}
}
sayHi() 라는 메소드를 정의했습니다.
요 메소드 안에는 딜레이를 2초동안 주는 기능을 넣었고 print로 "하이"를 찍습니다. sayHi의 매개변수로 completion을 주고 type은 String을 받겠다고 선언했습니다.
이후에 ViewDidLoad에서 sayHi 메소드를 호출하고 메소드의 변수를 result 변수로 받습니다.
그러면 sayHi안에있는 completion("메롱메롱")이 ViewDidLoad안에서 호출되는 sayHi메소드의 result변수에 들어오겠죠?
completionblock이란게 이런겁니다. 비동기처리가 되었다는걸 직관적으로 볼 수 있습니다.
로그를 찍어서 확인해 보면 원래대로 라면 sayHi함수가 실행되고 난 후에 print("ViewDidLoad가 비동기처리 전에 호출 됨")가 찍혀야 합니다.
하지만 비동기 처리는 sayHi 함수가 딜레이가 걸려있는 동안 print("ViewDidLoad가 비동기처리 전에 호출 됨")가 먼저 찍힌다는것을 볼 수 있습니다.
이것이 비동기처리의 개념입니다~
즐거운 코딩하세요~!