[swift] Swift에서 비동기 처리를 위한 결과 처리 방법

Swift는 비동기 작업을 처리하는데 매우 효과적인 기능을 제공합니다. 비동기 작업은 주로 백그라운드 스레드에서 실행되며, 작업이 완료되면 결과를 처리하기 위해 메인 스레드로 돌아옵니다. 이를 위해서 Swift에서는 몇 가지 결과 처리 방법을 제공합니다.

1. Completion Handler 사용하기

Completion Handler는 비동기 작업이 완료된 후 호출되는 클로저입니다. 작업이 완료되면 해당 클로저를 사용하여 결과를 처리할 수 있습니다. 다음은 Completion Handler를 사용한 예시입니다.

func downloadData(completion: @escaping (Data?) -> Void) {
    DispatchQueue.global().async {
        // 본래 비동기 작업 수행하는 코드
        let data = ...
        DispatchQueue.main.async {
            completion(data)
        }
    }
}

// 사용 예시
downloadData { data in
    if let data = data {
        // 결과를 처리하는 코드
    } else {
        // 에러 처리 코드
    }
}

2. Delegate 패턴 사용하기

Delegate 패턴은 객체 간 상호 작용을 위해 사용되는 패턴으로, 비동기 작업의 결과를 처리하는데 유용합니다. 작업이 완료되면 해당 객체의 delegate 메소드를 호출하여 결과를 전달합니다.

protocol DataDownloaderDelegate: class {
    func didDownloadData(data: Data?)
}

class DataDownloader {
    weak var delegate: DataDownloaderDelegate?
    
    func downloadData() {
        DispatchQueue.global().async {
            // 본래 비동기 작업 수행하는 코드
            let data = ...
            DispatchQueue.main.async {
                self.delegate?.didDownloadData(data: data)
            }
        }
    }
}

// 사용 예시
class ViewController: UIViewController, DataDownloaderDelegate {
    let downloader = DataDownloader()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        downloader.delegate = self
        downloader.downloadData()
    }
    
    func didDownloadData(data: Data?) {
        if let data = data {
            // 결과를 처리하는 코드
        } else {
            // 에러 처리 코드
        }
    }
}

3. NotificationCenter 사용하기

NotificationCenter는 여러 객체 간의 데이터 전달을 위해 사용되는 시스템이 제공하는 도구입니다. 비동기 작업의 결과가 발생하면 해당 객체는 NotificationCenter를 통해 결과를 알리고, 필요한 객체는 이를 구독하여 결과를 처리합니다.

extension Notification.Name {
    static let dataDownloaded = Notification.Name("dataDownloaded")
}

func downloadData() {
    DispatchQueue.global().async {
        // 본래 비동기 작업 수행하는 코드
        let data = ...
        DispatchQueue.main.async {
            NotificationCenter.default.post(name: .dataDownloaded, object: nil, userInfo: ["data": data])
        }
    }
}

// 사용 예시
class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        NotificationCenter.default.addObserver(self, selector: #selector(handleDataDownloaded(_:)), name: .dataDownloaded, object: nil)
        downloadData()
    }
    
    @objc func handleDataDownloaded(_ notification: Notification) {
        if let data = notification.userInfo?["data"] as? Data {
            // 결과를 처리하는 코드
        } else {
            // 에러 처리 코드
        }
    }
}

Swift에서는 다양한 방법을 통해 비동기 작업의 결과를 처리할 수 있습니다. 주어진 상황에 맞게 적절한 방법을 선택하여 비동기 작업의 결과를 효과적으로 처리하십시오.

참고 자료