Swift_DispatchQueueMainAsync

こんにちは、EveryDaySoft代表の永田です。

今回はDispatchQueue.main.asyncのselfを使用しないパターンをご紹介します。

DispatchQueueとは

method名{ }のようなブロック関数。クロージャーから構成されます。アプリのメインスレッドを表すディスパッチキューを除いて、システムはタスクの実行に使用するスレッドについて保証しません。

mainは

メインスレッドを指定する名称です。DispatchQueue.に続く動作を定義する属性は多数あります。

asyncは

アプリケーションを非同期で起動するように要求します。

selfを使用しないパターンは

[self] in がないと、self.t = “123” になります。

class A {

    var t: String?

    func a() {
        DispatchQueue.main.async { [self] in
            t = "123"
        }
    }
}
なぜselfを書く必要があるのか?selfは何か?

selfは、class自身です。

スレッドを作成して、複数の実行タスクを用意、実行出来るため、各実行するタスクがどのインスタンスか、システム自体が認識するためです。class A、class B、class Cか認識するためです。selfはインスタンスというもので、メモリ上にあるデータ構造を実行する名称です。self.tの場合は、class AのString型 tです。住所のようなイメージです。

なぜselfを書かないパターンを紹介したのか?

selfを書かないパターンでも実質上はDispatchQueue.main.async { [self] inとselfを定義しているので、書くコストを軽減できるためです。DispatchQueue.main.asyncの有無で、selfを書き換える動作は蓄積すると思いのほか、コストがかかるので、この書き方をおすすめします。

例外の紹介

DispatchQueue.main.asyncの親構造、子構造でクロージャー、ブロック関数を使用しnilを許容する作りになっている場合はselfを使用します。呼び出し側で使用しているメソッドが基本nilなので、selfでインスタンスを指定しないと、どのインスタンスのシステムか理解できないためです。

// call
method名()(url: URL, completion: @escaping (_ error: Error?) -> Void) {
 処理
}

// use
method名() { [weak self] error in
 DispatchQueue.main.async { 
  self?.t = "123"
 }
}

以上、貴重なお時間お読み下さいまして、誠にありがとうございます。