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