只是想知道是否可以取消或停止选择声明?
我的应用程序有一个 ultralite数据库。数据库连接和语句在单例内处理。
我有一个ViewController
,我开始在背景中进行繁重的READ
- 操作,有时需要2-3秒。在同一个ViewController
,您可以更改某些值并使用WRITE
- 操作保存它,这会取消ViewController
。
我的问题是,如果我真的很快和/或READ
- 操作非常慢,我的ViewController不会被解雇,因为WRITE
操作正在等待READ
操作的结束{1}} - 操作。用户界面冻结了几秒钟。
要么感谢我的谷歌搜索技能还是可怜的ultralite文档,有谁知道,如何取消当前正在进行的SELECT
- 声明?(结果不重要再过了,因为View会被驳回)或者我怎么能同时允许多个陈述?如果重要的话,READ
和WRITE
操作使用不同的表
编辑:(总结问题)
READ
和WRITE
吗?更新(详细): 好吧,我们找到了解决办法,但这并没有回答这个问题。
我们有一个带有 ShoppingCard ListView
的应用程序(项目存储在ultralite数据库中)。在此视图中,您可以在Freeform-ViewController
中更改项目(更改发货日期,金额数量......),其中显示了一些统计数据。
统计数据是繁重的READ
操作,有时最多需要五秒钟。因此,如果您更改项目数量并按DONE
按钮,Freeform-ViewController
将启动WRITE
- 操作(更新),将被解除并更新ShoppingCard(再次READ
到数据库进行更改)。
最后一点是坏事,但是我们为FreeformVC
实现了一个完成处理程序,它只更新数据库中的一个项而不是READ
整个购物卡。这似乎有效,但它不是最好的解决方案。如果你真的很快点击,如果你想再次从数据库中读取,你有时会感觉到延迟,所以问题仍然存在......
答案 0 :(得分:0)
首先 将数据库查询代码移动到另一个队列(这是一个很好的做法)
解决方案是:开始排队数据库操作。 这个解决方案非常简单,诀窍是将数据库查询分派到另一个队列
// Your read operation dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ // Query here // .... // Move back to Main queue dispatch_async(dispatch_get_main_queue(), ^{ // Update UI }); });
在此之后你的写操作会做同样的事情
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ // Write operation // .... });
此解决方案不会取消读取操作,但UI不会再冻结(ViewController将解除,但操作将一直运行直到完成)。
另一种可能的方式:由于ultralite数据库没有记录......我认为可能的方法之一是销毁和创建管理器实例(将单例类修改为非单例),如果这不会崩溃,它将会取消正在运行的操作。
另一种可能的方法:使用NSOperations,并尝试取消操作......也许" ultralite"将检查取消状态,并将停止查询。