AFNetworking 与 FMDB 使用过程中遇到的问题

AFNetworking 与 FMDB 都是iOS 开发者的神器,它们本身使用方便,更加值得学习研究。

近日有小伙伴遇到个问题,大概是这样的:用 AFNetworking 发送异步请求,将返回的数据存入数据库里。数据库是用 FMDB 创建的。可是问题来了,请求回的数据量比较大,存入数据库中耗时较长,这样就造成了卡顿。

原因是什么呢?查了相关资料发现,AFNetworking 请求数据成功后,返回的数据是在主线程处理的。我们一般在主线程更新 UI ,所以 AFNetworking 默认是把数据返回后在主线程使用。可是我们将数据存入数据库不需要占用主线程,那怎么办呢?

其实不用想也知道,AFNetworking 这么强大的三方库,肯定有相关的接口提供给我们。

[oper setCompletionQueue:dispatch_get_global_queue(0,0)];

其中 opera 是 AFHTTPRequestOperation 



这样就可以设置请求返回数据在其他线程处理了。可是如果你的数据库是这样创建的:FMDatabase *db = [FMDatabase shareDatabase]; 那么你可能会遇到错误,原因是数据库考虑到线程安全,你在主线程创建的数据库不能在此时用另一个线程访问。FMDB 这么强大,肯定也有解决方案啊,不错,

FMDataBaseQueue *queue = [FMDataBaseQueue databaseQueueWithPath:path];


这样创建数据库才是正确的。具体的使用方法也很简单,git 上有示例。不要以为这样就可以了,其实还会报错的,你的数据库会被加锁,原因还是线程问题。我们应该创建一个单利,保证只有一个 queue。这样才是安全的。

参考资料:FMDB 说明 FMDB 线程问题 AFNetworking网络请求的线程问题 http://blog.csdn.net/kyfxbl/article/details/38123239 非常感谢这几位作者!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lucy-JY

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值