【问题标题】:Using Couchbase in background thread在后台线程中使用 Couchbase
【发布时间】:2018-08-29 05:30:05
【问题描述】:

我正在开发一个使用 Couchbase 同步文档的应用程序。现在我在主线程上创建并使用相同的所有文档。

但现在我陷入了一种情况,我需要在除主线程之外的其他线程中创建和推送文档,而不是阻塞 UI。

如何在后台线程中运行 Couchbase 数据库的一部分以仅支持上述场景。

尝试了 Couchbase 文档中用于并发支持的方法。但是每当我在这样的后台线程中创建文档时,都会收到 线程安全崩溃 崩溃提示。

DispatchQueue.global(qos: .background).async {
   //creating couchbase documents here
}

遇到崩溃:

*** 由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“***** 线程安全” 违规:此数据库正在一个未创建的线程上使用 在!请参阅 Couchbase Lite 中的并发指南 文档。 *****

请帮忙。

【问题讨论】:

    标签: ios multithreading background couchbase couchbase-lite


    【解决方案1】:

    1.x 中的 Couchbase Lite API 不是线程安全的,并且支持线程限制模型。所以你不能跨线程共享对象——换句话说,如果你在主线程上创建了一个CBLDatabase 对象,你就不能在你的后台线程上使用那个实例。您将不得不为您的后台线程创建一个新实例。 所以请执行以下操作:

    • 创建一个新的serial dispatch queue
    • 创建一个CBLManager 实例
    • 将经理的dispatchQueue 属性设置为您创建的队列
    • 在您的队列中进行 dispatch_async 呼叫中的 Couchbase Lite 呼叫。

    顺便说一句,Couchbase Mobile 2.0 API 是线程安全的,如果这是一个新建项目,您可能需要考虑这一点。

    【讨论】:

    • 我可以在这里使用全局后台队列还是只需要创建串行队列?
    • Chceked。我仍然遇到同样的崩溃。我需要创建单独的 CBLDatabase 实例来在后台线程中运行任务吗?
    • 现在我正在崩溃。 *** -[CBL_FMDatabase beginUse] 中的断言失败,/Users/jenkins/jenkins/workspace/couchbase-lite-ios-builds/couchbase-lite-ios-community/vendor/fmdb/src/FMDatabase.m:979跨度>
    • 对于并发队列,您每次都需要创建一个数据库对象,因为其中没有线程安全性。完成后不要忘记关闭它。
    • @borrrden 我正在开发 cblite 2.1.0 并且我面临同样的问题,无论我是否在该屏幕上,database.addchangelistener 都会不断更新其中一个屏幕,因此它阻止了我的 ios 应用程序ui,你能帮帮我吗
    猜你喜欢
    • 1970-01-01
    • 2012-11-26
    • 2014-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-23
    • 1970-01-01
    相关资源
    最近更新 更多