我试图在后台运行数据库获取过程而不锁定用户界面。
目前我有一个按钮可以执行此操作,但我希望它是自动的,以便在用户浏览当前结果时可以获得更多结果。
以下是该按钮所执行的代码,我想自动执行此操作,而不是锁定UI。此外,如果有一种方法可以暂停该过程,但如果用户转到另一个非常有用的屏幕,则继续停止该过程。
提前致谢!
-(IBAction)continueUpdatingResultsButtonPressed:(UIButton*)sender{
[findMoreButton removeFromSuperview];
[self continueFindingMoreRecipes]; //(do this in background without locking screen)
[self loadRefreshButton];//At completion load this button (a blinking button) to refresh the cells with new results
}
答案 0 :(得分:6)
您可以使用的典型模式是这样的:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// perform data processing here (done in the background)
dispatch_async(dispatch_get_main_queue(), ^{
// update user interface here (done on the main thread)
});
});
答案 1 :(得分:2)
您可以执行批量请求,每当您的UI在当前结束的Y中时,您将缓存下一个X量的答案。根据您使用的内容,许多数据库都有可以帮助您轻松批量缓存的协议。祝你好运!
答案 2 :(得分:2)
使用盛大的中央调度。创建一个新队列,使用块调度它,当需要更新时,调用dispatch get main queue。一旦调度队列,就无法暂停此操作。也许将配方加载到中介然后根据需要更新。
寻找一些gcd教程,那里有一些不错的。
会给你更多代码,但我在iPhone上打字。
答案 3 :(得分:0)
让我感到震惊(特别是因为你是自己的admission,“编程非常新”),追求GCD在后台队列中预取数据可能并不谨慎,确保你将后台队列的数据库操作与前台的数据库操作(可能通过类似FMDB的FMDatabaseQueue
或类似的东西)进行协调,优雅地处理暂停此操作,同时转到其他屏幕(如您所示)在您的问题中)并确保您不会在此过程中导致保留周期。
更糟糕的是,我认为这是为了追求一个可能有问题的目标,如果我理解正确的话,在后台检索10,000个食谱。别误会我的意思。您当然可以像我们概述的那样设计所有后台操作,但我认为您应该停下来问问自己这是否适合您的业务问题。
我可能会建议一个更容易解决的问题。只需使用第一个 x 配方加载tableview,当用户向下滚动时,当您开始接近tableview的末尾时,检测到该事实并检索下一个 x 记录并将它们添加到tableview。但是任何期望用户翻阅10,000个条目的用户界面都不会通过气味测试。当我想到一个包含10,000个条目的数据库时,我会想到更像是imdb / wikipedia / google / facebook-like用户界面而不是联系人风格的用户界面。
无论如何,你几乎肯定不希望你的应用程序只是在后台无休止地检索食谱。您可以解决UI性能问题,但可能会将其替换为内存管理问题。当你的食谱应用程序是否需要时,你将设计一个复杂的系统架构。