Closed ianhwu closed 7 years ago
你给的这个 demo 里查询并没有被插入操作阻塞,第一次启动 app 查询能立马返回(此时 db 没有多少数据,save 还没全部执行完),第二次启动 app 查询返回慢是因为 db 里的数据量太大了,几十万条数据全部拿出来是需要几秒种时间。
GYDataCenter 对你说的这种情况做过优化,注意 save 的时候 GYDataContext 那一层是 dispatchSync(dispatch 到 cache 队列),GYDbRunner 那一层是 dispatchAsync(dispatch 到 DB 队列),框架尽量的把任务放到 cache 队列执行(包括 cache 操作,拼接 sql 语句,准备 sql 的 binding 参数。。。),DB 队列仅仅是到 sqlite 执行 sql,以此来均衡两个队列的执行时长。
看到了, 所以说只要大数据量的查询开个线程就不会出问题了。
我看了一下源码, 在
- (void)asyncInDatabase:(void (^)(FMDatabase *db))block
这个方法中, 也是使用 FMDatabaseQueue , 但 FMDatabaseQueue 是一个串行的队列, 而且 GYDataContextQueue 中的队列也是一个串行的队列, 如果在同时有很多插入的时候, 查询就要等待插入完成来执行, 我想问一下,在使用查询的时候每次都开个异步线程来保证主线程不被阻塞吗?还是使用其他方法?GYDataCenterTest.zip