【Swift】クロージャを使った非同期処理の解説

ファイルのダウンロードや画像処理の関数はSwiftで用意されていますが、いずれも非同期でcompletionHandler(=クロージャ、コールバック関数)をパラメータに取るものが多いです。

以下はクロージャを使った非同期処理の例です。地図のスナップショットを撮影する関数を作成しています。

    //引数がクロージャになっています
    func takeSnapshot(completion: @escaping (UIImage?) -> ()){
        
        //位置情報が取得できていなかったらリターン
        guard let loc = loc else {
            completion(nil)
            return
        }
        
        let center = loc.coordinate
        let span = MKCoordinateSpan(latitudeDelta: delta, longitudeDelta: delta)
        let options = MKMapSnapshotter.Options()
        options.region = MKCoordinateRegion(center: center, span: span)
        options.size = CGSize(width: 320.0, height: 320.0)

        let snapshotter = MKMapSnapshotter(options: options)

        snapshotter.start(completionHandler: {(snapshot, error) in
            if(error != nil){ 
                completion(nil) 
                return
            }
            
            guard let image = snapshot?.image else {
                completion(nil)
                return
            }
            
            completion(image)
                        
        })
    }

スナップショットを撮影するMKMapSnapshotterのstartはクロージャをパラメータに取ります。

クロージャをパラメータにしている関数を呼び出す関数自身もクロージャを引数にすると、エラーが発生した場合はcompletionでnilを返すことができます。

ABOUTこの記事をかいた人

個人アプリ開発者。Python、Swift、Unityのことを発信します。月間2.5万PVブログ運営。 Twitter:@yamagablog