250x250
반응형
Notice
Recent Posts
Recent Comments
Link
관리 메뉴

스윞한 개발자

IOS 컴플레션 블럭 / 비동기 처리 본문

Swift 실습

IOS 컴플레션 블럭 / 비동기 처리

스윞남 2024. 1. 24. 18:20
728x90
반응형
SMALL

이번 포스팅에서는 컴플레션 블럭/비동기처리에 대해 알아보고 실습해보았습니다!

 

 

 

Swift에서의 Completion Block 및 비동기 처리는 비동기 작업을 수행하고 작업이 완료된 후 결과를 처리하는 방법을 제공합니다.

Completion Block(완료 블럭)

* Completion Block은 함수나 메서드의 매개변수로 전달되는 클로저입니다.
* 비동기 작업이 완료되었을 때 호출되어 작업의 결과를 처리합니다.
* 주로 비동기 작업이 완료된 후 결과를 받아와 UI 업데이트, 데이터 처리, 에러 처리 등을 수행합니다.

 

 

func fetchData(completion: (Result<Data, Error>) -> Void) {
// 비동기 작업 수행 후
if let data = receivedData {
completion(.success(data))
} else {
completion(.failure(NetworkError.invalidData))
}
}
fetchData { result in
switch result {
case .success(let data):
// 데이터 사용
case .failure(let error):
// 에러 처리
}
}

비동기 처리

* Swift는 비동기 작업을 수행하기 위해 'async'/'await' 패턴을 도입했습니다.
* 'async' 키워드를 사용하여 비동기로 실행될 함수나 메서드를 선언하고, 'await' 키워드를 사용하여 비동기 작업의 결과를 받아옵니다.
* 비동기 작업은 기존의 스레드를 차단하지 않고 백드라운드에서 실행되며, 작업이 완료된 후에 결과를 처리합니다.

 

func fetchData() async throws -> Data {
// 비동기 작업 수행
let data = try await URLSession.shared.data(from: url)
return data
}
async func process() {
do {
let data = try await fetchData()
// 데이터 사용
} catch {
// 에러 처리
}
}
Task {
await process()
}

 

먼저 간단하게 비동기 처리의 실습을 해보겠습니다.

기존의 방식대로 fileprivate func을 만들어 viewDidLoad에서 sayHi 함수를 호출해보았습니다.

 

 

2초간 지연을 시켜주기 위해 메인 쓰레드에서 빼내서 현재에서 +2를 진행해 2초뒤에 실행해 보겠습니다.

 


터미널에서는 2초 뒤에 Hi 되었고, completionBlock을 사용하기 위해 위와 같이 함수를 수정해 주었습니다.

해당 함수가 종료된 시점에 completion()을 해줌으로써 종료를 알수 있습니다.

 

 

completion에서 종료를 알리고 값을 넘겨줄 수 있습니다.
viewDidLoad() 에서 completion 으로 부터 값을 넘겨받아 터미널에 출력합니다.

 

 

ViewController의 실습을 진행하기 위해 로딩 오픈소스를 다운 받습니다.

(커스텀 로딩오픈소스를 다운받아 실행해도 되고, 내장된 UIActivityIndicatorView를 사용해도 됩니다!)

 

 

 

 

 


해당 오픈 소스를 다운 받기 위해 pod하지 않고, Xcode에서 바로 다운 받기 위해 Package Dependencies 해줍니다.

 

 

 

KRProgressHUD 패키지를 사용하기 위해 import 해줍니다.

 

 

각 로딩 이미지를 실행 시켜줌으로써 completion 실행 전과 후에 로딩 이미지가 추가 됩니다.

 

 

 


Label을 view에 추가해주고

 

 

 

 


완료 로딩 이미지가 종료 되면, mainTitle의 텍스트를 completion에서 반환된 값으로 변경해줍니다.
viewDidLoad, completion 안에서는 self를 써주어야 실행 가능합니다.

 

 

 

참고(출처) : 개발하는 정대리

728x90
반응형
LIST