FMDB 在多线程中的使用

简介: 在App中保持一个FMDatabaseQueue的实例,并在所有的线程中都只使用这一个实例。[FMDatabaseQueue databaseQueueWithPath:path];...

在App中保持一个FMDatabaseQueue的实例,并在所有的线程中都只使用这一个实例。

[FMDatabaseQueue databaseQueueWithPath:path];

FMDatabaseQueue虽然看似一个队列,实际上它本身并不是,它通过内部创建一个Serial的dispatch_queue_t来处理通过inDatabaseinTransaction传入的Blocks,所以当我们在主线程(或者后台)调用inDatabase或者inTransaction时,代码实际上是同步的。FMDatabaseQueue这么设计的目的是让我们避免发生并发访问数据库的问题,因为对数据库的访问可能是随机的(在任何时候)、不同线程间(不同的网络回调等)的请求。内置一个Serial队列后,FMDatabaseQueue就变成线程安全了,所有的数据库访问都是同步执行,而且这比使用@synchronizedNSLock要高效得多。

但是这么一来就有了一个问题:如果后台在执行大量的更新,而主线程也需要访问数据库,虽然要访问的数据量很少,但是在后台执行完之前,还是会阻塞主线程。
对此,robertmryan给出了一些想法:

  1. 如果你是在后台使用的inDatabase来执行更新,可以考虑换成inTransaction,后者比前者更新起来快很多,特别是在更新量比较大的时候(比如更新1000条或10000条)。
  2. 拆解你的更新数据量,如果有300条,可以分10次、每次更新30条。当然有时不能这么做,因为你可能通过网络请求回来的数据,你希望一次性、完整地写入到数据库中,虽然有局限性,不过这确实能很好地减少每个Block占用数据库的时间。
  3. 上面两点可以改善问题,但是问题依然是存在的,在大多数时候,你应该把从主线程调用inDatabaseinTransaction放在异步里:

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        [self.databaseQueue inDatabase:^(FMDatabase *db) {
            //do something...
        }];
    });

    这种方式能解决不依赖于数据库返回的结果的情况,如果对返回结果有依赖,就需要考虑UI上的体验了,如加一个UIActivityIndicatorView

目录
相关文章
|
JavaScript 前端开发 开发者
正则表达式深度解析:斜杠的妙用
【2月更文挑战第29天】
2017 0
正则表达式深度解析:斜杠的妙用
|
JSON 自然语言处理 编译器
Alibaba.com瘦包40MB——业界最全的iOS包大小技术总结
前言包大小是衡量APP性能的一项重要指标,它直接影响用户的下载点击率(包太大不想下)、下载安装成功率(下载慢不用了)、APP卸载率(太占空间先删掉)。包大小的计算逻辑很简单,它是各种类型的文件占用磁盘大小相加。APP瘦身的技术却很复杂,代码文件的复杂度和编译器策略决定了可执行文件的大小,业务功能和工程架构决定了代码文件的复杂度。iOS APP瘦身,需要掌握的技能有XCode构建技术、LLVM编译器
4441 0
Alibaba.com瘦包40MB——业界最全的iOS包大小技术总结
|
前端开发 数据处理 开发者
vuex中mutations详解,与actions的区别
Vuex 的 Mutations 是用于改变 Vuex Store 中状态的一种方式。它是一个同步的操作,用于直接修改 Store 中的状态。
|
iOS开发
iOS多线程之NSOperationQueue-依赖、并发数、优先级、自定义Operation等最全的使用总结
iOS多线程之NSOperationQueue-依赖、并发数、优先级、自定义Operation等最全的使用总结
744 0
sourcetree设置忽略文件
sourcetree设置忽略文件
582 0
|
安全 关系型数据库 MySQL
讲解移动应用中的数据同步技术。
【4月更文挑战第1天】移动应用数据同步确保跨设备一致性,常见方法包括:数据库主从复制(如MySQL)维护多副本一致性;使用Firebase等框架简化同步并支持离线功能;选择HTTP、轮询、Socket或Push服务等同步协议,权衡实时性与实现复杂度;蚂蚁集团的SYNC提供安全大规模数据同步。开发者须依据实时性、安全性、性能需求及网络条件选择合适技术。
449 0
|
JSON 数据格式 iOS开发
APNS IOS 消息推送JSON格式介绍
在开发向苹果Apns推送消息服务功能,我们需要根据Apns接受的数据格式进行推送。下面积累了我在进行apns推送时候总结的 apns服务接受的Json数据格式 示例 1: 以下负载包含哦一个简单的 aps 字典。
3621 0
|
iOS开发
iOS (DZMCycleScrollView)无限滚动 - 无限轮播 - ScollView
iOS (DZMCycleScrollView)无限滚动 - 无限轮播 - ScollView
219 0
iOS (DZMCycleScrollView)无限滚动 - 无限轮播 - ScollView
|
Android开发
MAC 安卓(Android) 编辑器无法识别真机
MAC 安卓(Android) 编辑器无法识别真机
292 0
|
iOS开发
SwiftLint落地调研
在项目中加入lint来保证代码质量
414 0