3

我试图在不锁定用户界面的情况下在后台运行数据库获取过程。

目前我有一个按钮可以执行此操作,但我希望它是自动的,以便在用户浏览当前结果时可以获得更多结果。

这是按钮执行的代码,我想让它自动执行,而不是锁定 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

}

4

4 回答 4

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)
    });
});
于 2012-11-20T03:01:22.667 回答
2

您可以执行批处理请求,每次您的 UI 在当前端的 Y 中获取时,您都会缓存下一个 X 数量的答案。根据您使用的内容,许多数据库都有可以帮助您轻松批量缓存的协议。祝你好运!

于 2012-11-20T02:11:06.137 回答
2

使用盛大的中央调度。创建一个新队列,用一个块调度它,当你需要更新时,调用 dispatch get main queue。但是,一旦调度了队列,就无法暂停此操作。也许将食谱加载到中介中,然后根据需要进行更新。

寻找一些 gcd 教程,那里有一些不错的教程。

会给你更多的代码,但我在 iPhone 上打字。

于 2012-11-20T03:03:30.183 回答
0

让我感到震惊(尤其是因为您自己承认“对编程非常陌生”),在后台队列中使用GCD预取数据可能并不谨慎,请确保您协调后台队列的数据库操作与前台的数据库操作(可能通过类似FMDBFMDatabaseQueue东西或类似的东西),当您转到其他屏幕时(如您在问题中指出的那样)优雅地处理暂停此操作,并确保您不会在此过程中导致保留周期。

更糟糕的是,我认为这一切都是为了追求一个可能有问题的目标,如果我理解正确的话,那就是在后台检索 10,000 个食谱。不要误会我的意思。您当然可以像我们概述的那样设计所有后台操作,但我认为您应该停下来问问自己,这是否适合您的业务问题。

我可能会建议一个无限简单的解决方案。只需使用前x 个配方加载您的 tableview,当用户向下滚动时,当您开始接近 tableview 的末尾时,检测该事实并检索下一个x记录并将它们添加到 tableview。但是任何期望用户翻阅 10,000 个条目的用户界面都没有通过气味测试。当我想到一个包含 10,000 个条目的数据库时,我想到的更像是类似 imdb/wikipedia/google/facebook 的用户界面,而不是联系人样式的用户界面。

无论如何,您几乎肯定不希望您的应用程序只是在后台无休止地检索食谱。你可以解决你的 UI 性能问题,但也许用内存管理问题来代替它。当您的食谱应用程序是否需要时,您将设计一个复杂的系统架构。

于 2012-11-20T03:43:58.213 回答