3

私はdispatch_asyncを使用してアプリケーションでバックグラウンドスレッドを実行していますが、メインスレッドとバックグラウンドスレッドの両方が同時にデータベースにアクセスすることがあります。これによりデータベースエラーが発生し、常に2を返すsqlite3_threadsafe()を使用して解決しようとしました。つまり、2つのスレッドで同じデータベース接続を使用することはできず、1を返したいのですが、この点で誰かが私を助けてくれますか?

4

2 に答える 2

4

あなたは間違ったアプローチを追求していると思います。SQLite は、どのようにコンパイルしても確実にスレッドセーフではありません — FAQ を参照してください。SQLite がスレッド セーフのためにコンパイルされている場合でも、保留中のトランザクションやステートメントがファイナライズされていない場合、複数のスレッドから同じデータベースを使用することはできません。

上記の Grand Central Dispatch を使用してすべての SQLite アクセスをシリアル ディスパッチ キューに集中させるという推奨事項は、私の意見では正しい方法ですが、メイン キューを使用するよりも独自のキューを作成することをお勧めします。結果を待ちたいときに確実に dispatch_sync できるという単純な理由です。

于 2012-05-08T03:17:38.743 に答える
1

すべてのアクセス ステートメントを追加できるため、sqlite ストアにアクセスするときは常にメイン スレッドにいます。

dispatch_async(dispatch_get_main_queue(), ^ {
    //code goes here
});
于 2012-05-08T03:15:56.577 に答える