目前比较火的 iOS 端的数据库, realm、CoreData、FMDB, 就学习成本看来,FMDB 应该是最低的,本文主要说 FMDB 多线程造成 locked 的问题, 和主线程阻塞问题。

当 查询、插入、 删除、 更新 同时对同一数据操作的时候, 就会造成 “database is locked” , 而且会存在数据安全问题, 如何避免这种情况发生? 最简单的方法就是在同一个线程中对数据库进行操作, 什么是同一个线程? 我们日常开发中经常使用到 dispatch_asyncdispatch_sync, dispatch_async 一定会开辟一个新线程吗?
答案是不一定, 当 dispatch_async 使用在一个串行队列中, 这个串行队列中只有一个线程, 而且所有的 dispatch_async 是顺序执行的, 所以只有最开始用的时候, 会开辟一个线程。 dispatch_sync 可以阻塞当前线程和后面的队列(目标队列),因为 dispatch_sync 是在当前队列的当前线程执行一段代码, 所以如果使用 dispatch_sync 进行一段耗时操作, 肯定会阻塞当前线程。当 dispatch_async 使用并行队列的时候,每次都会开辟一个新线程 (前提是前面的线程都没执行完, 如果执行完也会复用), dispatch_sync 和串行的效果是相同的。

HYDatabaseManager 我之前自己也基于 FMDB 封装了一个,, 如果感兴趣的可以看一下。

这篇文章主要针对于使用了 FMDB , 但不知道为什么会 locked 和 sleep 的同学。