关闭

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

标签: ios线程数据库数据异步
83人阅读 评论(0) 收藏 举报
分类:

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 非常感谢这几位作者!

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:7118次
    • 积分:439
    • 等级:
    • 排名:千里之外
    • 原创:35篇
    • 转载:4篇
    • 译文:1篇
    • 评论:0条
    文章分类