FMDB 阻止了我的 UI
Posted
技术标签:
【中文标题】FMDB 阻止了我的 UI【英文标题】:FMDB block my 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! 【参考方案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 transactions
和FMDatabaseQueue
。以上是关于FMDB 阻止了我的 UI的主要内容,如果未能解决你的问题,请参考以下文章