[iOS] async/await 사용해 보기

Han's·2023년 6월 26일
0
post-thumbnail

async/await란?

  • 기존의 비동기 처리 방식보다 비동기 작업을 더 쉽게 작성하고 관리할 수 있습니다.
  • async/await를 사용하면 비동기 코드를 보다 직관적이고 동기적으로 작성할 수 있으며, 에러 처리도 간편하게 할 수 있습니다.

사용 방법

  • 메서드 이름 오른쪽에 async를 붙여서 비동기 처리된다는 것을 알려야 합니다.
  • async 함수를 호출하기 위해서는 await를 사용하면 됩니다.

예제 코드) 버튼을 누르면 TodoList 데이터를 받고 Label에서 보여주는 예제입니다. (데이터가 많은 관계로 예시에서는 TodoList의 마지막 요소만 보여줍니다.)

viewModel

  • await는 말 그대로 '기다리다'는 뜻으로 비동기 함수 호출 시 중단 시점입니다.
    아래 코드에서 requestData는 RequestTodoList() 메서드로 [Todo]를 받을 때까지 기다리겠다는 의미입니다. (받지 못할 수 있으니까 do -catch문으로 에러 처리!)
final class RequestTodoList {
    
    private let todoUrl = URL(string: "https://jsonplaceholder.typicode.com/todos")!
    
    func getTodoList() async -> [Todo] {
        do {
            let requestData = try await RequestTodoList()
            return requestData
        } catch {
            print("error: \(error.localizedDescription)")
            return []
        }
    }
}

private extension RequestTodoList {
    func RequestTodoList() async throws -> [Todo] {
        do {
            return try await AF.request(todoUrl).serializingDecodable().value
        } catch {
            throw error
        }
    }
}

ViewController

  • Task로 묶어서 async 메서드 호출
class ViewController: UIViewController {
    
    @IBOutlet weak var TodoLabel: UILabel! // 요청 후 받은 TodoList를 보기 위한 Label
    
    let viewModel = RequestTodoList()
    
    @IBAction func getRequest(_ sender: UIButton) { // 버튼을 클릭하면 TodoList를 가져옵니다.
        Task {
            let todos = await viewModel.getTodoList()
            guard let todo_last = todos.last else { return }
            TodoLabel.text = "\(todo_last)"
        }
    }
}

profile
 iOS Developer

0개의 댓글