私はとてもとしてシングルトンクラスを持っている:Swift Class Singletonインスタンスのスレッドを安全にする方法はありますか?
class Database {
static let instance:Database = Database()
private var db: Connection?
private init(){
do {
db = try Connection("\(path)/SalesPresenterDatabase.sqlite3")
}catch{print(error)}
}
}
は今、私はクラス内の関数を実行するためにDatabase.instance.xxxxxxを使用して、このクラスにアクセスします。しかし、別のスレッドからインスタンスにアクセスすると、別のインスタンスを作成しようとするような奇妙な結果がスローされます。私は同じスレッドでインスタンスを参照する必要がありますか?
は奇妙な結果がデータベースを示し明確にするために、I /一度にDBにアクセスしようとしているため、2つのインスタンスのOエラー更新
データベース・コードの詳細は、この質問を参照してください。Using transactions to insert is throwing errors Sqlite.swift
スウィフトシングルトンの作成はスレッドセーフです。これは、シングルトンインスタンスで呼び出す関数が魔法のようにスレッドセーフであることを意味するものではありません。関数をスレッドセーフにする必要がある場合は、セマフォ、シリアルディスパッチキュー、または操作キューのようなものを使用する必要があります。 – Paulw11
'しかし、別のスレッドからインスタンスにアクセスすると、別のインスタンスを作成しようとしたような奇妙な結果になります。あなたの 'Database'クラスの現在の定義を考えると、**インスタンスを2つ作成することはできません。しかし、おそらくあなたが表示していないそのクラスにもっとコードがあります。 BTW:クラスの最後の改良:サブクラス化を防ぐためには、それを 'final'として宣言する必要があります。 –
クラス内の追加コードは** addRow **機能を示します。この関数は、alamofire補完ブロックで呼び出され、データを挿入できない場所でエラーをスローします。興味深いことに、私は私のDatabase.instanceへのすべての呼び出しを削除する場合。シングルトンとコードの問題のビットを最初に実行させる、それは正常に動作します... –