gpt4 book ai didi

iphone - 比 -forwardInspiration : to perform messages on a specific thread 更快的方法

转载 作者:行者123 更新时间:2023-12-03 21:06:47 26 4
gpt4 key购买 nike

为了提高响应能力,一些使用 FMDB 在主线程上执行 SQLite 查询的同步方法被重写为异步方法,并通过 -performSelectorInBackground:withObject: 在后台运行。 SQLite 不是线程安全的,但是,这些方法中的每一个最终都会调用 -[FMDatabase open],从而降低整体性能。

因此,我为 FMDB 类编写了一个代理,该代理重写了 -forwardInspiration: 以通过 在一个特定线程上执行 -[NSInvocavokeWithTarget:] -performSelector:onThread:withObject:waitUntilDone:。这样解决了-[FMDatabase open]调用过多的问题,但是-forwardInitation:本身的开销是相当大的。

有没有一种好的方法可以解决这个性能问题,而无需重写所有调用 FMDB 方法的代码?

最佳答案

您已发现问题:请勿调用-performSelectorInBackground:withObject: !无法保证它会做什么,但它可能不会做正确的事情。

如果您想要的是用于后台操作的单个“数据库线程”,那么有几个选项:

  • 创建一个新的数据库线程并运行循环并使用 -performSelector:onThread:...相反。
  • 创建一个 maxConcurrentOperationCount=1 的 NSOperationQueue 并使用 NSOperation(也许是 NSInitationOperation?)或串行调度队列。 这不太正确:不能保证操作/ block 在同一线程上执行,这可能会破坏 sqlite(IIRC,您只能在释放所有语句后在线程之间移动数据库句柄)
  • 使用 NSOperationQueue,但保存对数据库的线程本地引用 [[NSThread currentThread] threadDictionary] 。这有点困惑,因为您几乎无法控制数据库何时消失。它还可能违反 NSOperation 契约(当操作完成时,您应该将线程返回到其原始状态)。

关于iphone - 比 -forwardInspiration : to perform messages on a specific thread 更快的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6393207/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com