【问题标题】:FMDB block my UIFMDB 阻止了我的 UI
【发布时间】:2015-06-29 13:32:56
【问题描述】:

iOS 中的 Fmdb,我的任务是将 100 个 JSON 字符串从网络转换为我的模型,然后在 UITableViewCell 上表示它们,因为我有 3 个按钮来更改 UITableView 上的数据,所以我将数据 fmdb 到本地,当我更改数据时,它首先检查以读取本地数据,然后请求最新数据以重新加载 UITableView 并保存到数据库。所有 3 个更改具有相同的逻辑。因为要存储的 100 个数据我选择异步调度 for 语句,所以问题是当模型插入到表中时,它会卡住我的 UI。我的表有 10+ 列,是否有任何可能只是因为太多列导致插入假设太多时间?

【问题讨论】:

  • “杰森”?您是否只听到了要求而没有看到它们被写下来?
  • @Droppy json数据,抱歉打错了,插入程序成功,只有程序阻塞了我的UI!
  • “异步调度”到哪个队列?
  • @Justin 那么你可能没有异步调度过程
  • @Droppy 全局队列,默认为 0,0!

标签: ios json fmdb


【解决方案1】:

根据 FMDB 文档,您最好使用 FMDatabaseQueue

要在多个线程上执行查询和更新,您需要使用 FMDatabaseQueue。

同时使用来自多个线程的单个 FMDatabase 实例是一个坏主意。每个线程都可以创建一个 FMDatabase 对象。只是不要跨线程共享单个实例,绝对不要同时跨多个线程。

改为使用 FMDatabaseQueue。

这是reference

【讨论】:

  • 我在使用 dispatch_queue_t 时有一个问题,然后问题就不存在了。也许 FMDatabaseQueue 与处理多线程问题相同。现在我想知道sqlite表中的元素在FMDB源代码中已经有lock && unlock,那么为什么我们需要queue来解决这个多线程问题呢?
  • @SevenJustin 数据库有锁 && 解锁,而不是元素。如果你做一些更新操作,同时你想做一些删除操作,如果你不把你的操作放入队列,可能会出现错误。
  • 所以我明白了你的意思,然后我将修改我的插入或删除方法来包装 [db open]...insert 或 update....[db close] 带锁的块。对吗?
  • 我使用table作为singleSkeleton,并且insert update delete方法都有[db open]和[db close]的操作,就像
  • @SevenJustin [db open]->delete/update/add->[db close],如果你做高频操作,使用db transactionsFMDatabaseQueue
猜你喜欢
  • 1970-01-01
  • 2011-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-26
  • 2013-11-20
  • 1970-01-01
  • 2016-11-17
相关资源
最近更新 更多