並列処理(排他制御)マルチスレッドで処理するプログラムを書いていると、同時にアクセスするとまずいリソースがあってそれでも別々のスレッドでアクセスしないといけない場合がままある。こんなとき、排他制御ってのをやってそういうリソースにアクセスするのは必ず1つのスレッドにするようにする。ここでは、DispatchSemaphoneを使ってやってみる。counterを100回カウントアップする処理を100個並列処理して結果を表示するプログラムを書いてみた。counterをカウントアップする関数を用意する。10000って表示される。セマフォを使わないと10000以外の値になる場合がある。print(counter)これを実行すると必ず10000と表示される。semaphore.wait()、semaphore.signal()コメントアウトして実行すると、10000以外になることがある。並列処理を行うには、ディスパッチキュー、オペレーションキュー、Threadクラスの3種類の方法がある。Dispatch(GCD)って言うスレッドを管理する機能を使って実行する。ディスパッチキューはGCDをラップしただけのもの(と思う)で、オペレーションキューはより高機能にしたもの(と思う)だ。Threadクラスは、まーマルチスレッドの基本的な機能を提供しているもので、ディスパッチキューやオペレーションキューの下働きを行っている。ここでは、オペレーションキューを使う。単純に別スレッドでなんか実行する。キューに処理を追加する。print("END")これを実行すると、こんな表示になる。hoge2hoge1ENDaddOperationでキューに追加した処理が別スレッドで実行され、hoge2が表示されたあと、約10秒後、hoge1が表示される。3つの処理を並列実行させてみる。3種類の処理(BlockOperation)を用意する。op1->op2->op3の順で実行されるようにする。op2はop1が終わってから実行されるようにする。op3はop2が終わってから実行されるようにする。キューに処理を追加する。queue.waitUntilAllOperationsAreFinished()これを実行すると、3つの処理の表示が入り乱れてこんな感じに表示される。(null)},op1,9ソースでコメントアウトしているコードで処理(オペレーション)の依存関係が設定できる。op2.addDependency(op1)でop1の処理が終わらないとop2が実行されないようになる。コメントアウトしている依存設定を有効にすると、op1の実行がおわってから、op2が実行され、op2が終わってからop3が実行される。NSBrowserを使ってみるFinderのカラム表示を実現するやつだ。こんなのを作ってみる。データのクラスを用意する。}}ViewControllerクラスにNSBrowserDelegateプロトコルを実装する。NSBrowserDelegate"を追加する。必要なメソッドや表示するデータをクラスに追加する。表示するデータのメンバ変数を追加。"ROOTNODE")viewDidLoad()でデータの初期化する。}必要なメソッドを追加する。Controllerを接続する。Swiftサラリーマンにたどり着いた。このサイトではCocoaPodsを使っているみたいなんだが、ここでは手動でやってみようと思う。macOSを対象にやっていくが、iOSでも同じような感じだ。ここからダウンロードして展開しておく。Sqliteを使うプロジェクトを用意して、ダウンロードしたGRDBにあるGRDB.xcodeprojを追加する。PhasesにmacOSならGRDBOSX、iOSならGRDBiOSを追加する。Phasesタブを選択するとそこにある。ボタンを押してGRDBOSX(GRDBiOS)を追加する。BinariesにGRDB.frameworkを追加する。Binariesはプロジェクトを選んでGeneralタブを選択するとそこにある。ボタンを押してGRDB.frameworkを追加する。同じことをやってみる。テーブル作ったり、データ追加したり、検索したりするのはこんな感じになる。JSONJSONSerializationというクラスがあってこれを使う。JSONの文字列からオブジェクト(ArrayやDictionary)に変換する。}オブジェクトをJSON(文字列)に変換する。オブジェクトは、NSArray、NSDirctionaryでその中の値は、NSString、NSNumber、NSDictionary、NSNullでNSDictionaryのキーはNSStringじゃないといけない。JSONに変換(.prettyPrintedを指定すると見やすいように改行や空白が挿入される。Dataを文字列に変換する。ROMイメージを作ってみる。ファイルオープンダイアログを出す。