在iOS中,如何在所有Parse.com查找/保存操作完成后才能执行某些代码?

时间:2013-06-10 03:22:40

标签: ios objective-c xcode objective-c-blocks

我正在使用Xcode 4.6.2,尝试开发iPhone应用程序。

在我的业余时间里,我一直在努力工作几周,而且我正在考虑放弃开发并且从不尝试再次创建移动应用程序。我应该做一件容易的事情,这让我非常沮丧......

我所要做的就是:

  1. 使用Parse.com的API来“findObjects”/“findObjectsInBackgroundWithBlock”& “save”/“saveInBackgroundWithBlock”获得&保存数据;然后
  2. 完成所有此类操作后,在此之后执行操作(完全了解所执行的所有Parse操作的结果)。
  3. 例如,我想通过for循环将一些对象保存到Parse,然后在保存它们之后,知道有多少是成功的,错误的等等,这样我就可以在屏幕上显示这些数字。 / p>

    另外,例如,我想在Parse.com中查找对象时做同样的事情,然后在找完东西后,计算并显示找到的项目数量,重复数量等等(再次,在iPhone屏幕上)

    为什么这么难?!

    我尝试过使用大量的Grand Central Dispatch示例,例如“dispatch_async”和“dispatch_group_async”+“dispatch_group_notify”。我已尝试使用“WithBlock”Parse.com方法以及非阻止版本的GCD。

    示例问题#1:在从Parse.com检索所有项目之前,spinner隐藏(我希望hideSpinnerDownloadingMovies方法 - 以及其中的任何其他内容 - 仅在fetchDataWithBlock之后执行,并且fetchedDataWithBlock中的所有findObjectsInBackgroundWithBlock都完全完成!)

            [self showSpinnerDownloadingMovies];
            dispatch_queue_t queue = dispatch_queue_create("com.app.task", NULL);
            dispatch_queue_t main = dispatch_get_main_queue();
            dispatch_async(queue, ^{
                [self fetchDataWithBlock];
                dispatch_async(main, ^{
                    [self hideSpinnerDownloadingMovies];
                });
            });
    

    [来源] http://cocoasamurai.blogspot.com/2009/09/guide-to-blocks-grand-central-dispatch.html

    日志的内容如下:

    2013-06-09 18:17:09.159 TestApp[4425:4503] Epic
    2013-06-09 18:17:09.160 TestApp[4425:4503] 104
    2013-06-09 18:17:09.236 TestApp[4425:4503] Star Trek Into Darkness
    2013-06-09 18:17:09.237 TestApp[4425:4503] 129
    2013-06-09 18:17:09.341 TestApp[4425:c07] movie added!
    2013-06-09 18:17:09.385 TestApp[4425:4503] Fast & Furious 6
    2013-06-09 18:17:09.386 TestApp[4425:4503] 130
    2013-06-09 18:17:09.484 TestApp[4425:c07] movie added!
    2013-06-09 18:17:09.545 TestApp[4425:4503] After Earth
    2013-06-09 18:17:09.545 TestApp[4425:c07] movie added!
    2013-06-09 18:17:09.546 TestApp[4425:4503] 100
    2013-06-09 18:17:09.634 TestApp[4425:4503] The Hangover Part III
    2013-06-09 18:17:09.635 TestApp[4425:4503] 100
    2013-06-09 18:17:09.636 TestApp[4425:c07] hiding spinner...
    2013-06-09 18:17:09.742 TestApp[4425:c07] movie added!
    2013-06-09 18:17:09.968 TestApp[4425:c07] movie added!
    

    (看看在fetchDataWithBlock完成之前hideSpinnerDownloadingMovies方法是如何执行的?)

    示例问题#2:与上面相同,代码的顺序无法保证(在fetchDataWithBlock中仍然可以找到/处理某些对象时执行hideSpinnerDownloadingMovies等。)

        [self showSpinnerDownloadingMovies];
        dispatch_group_t group = dispatch_group_create();
        dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            [self fetchDataWithBlock];
        });
        dispatch_group_notify(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            [self hideSpinnerDownloadingMovies];
        });
    

    [来源] Waiting until two async blocks are executed before starting another block

    日志的内容如下:

    2013-06-09 23:09:04.291 TestApp[4983:4903] Epic
    2013-06-09 23:09:04.292 TestApp[4983:4903] 104
    2013-06-09 23:09:04.365 TestApp[4983:4903] Star Trek Into Darkness
    2013-06-09 23:09:04.366 TestApp[4983:4903] 129
    2013-06-09 23:09:04.544 TestApp[4983:4903] Fast & Furious 6
    2013-06-09 23:09:04.545 TestApp[4983:4903] 130
    2013-06-09 23:09:04.696 TestApp[4983:4903] After Earth
    2013-06-09 23:09:04.697 TestApp[4983:4903] 100
    2013-06-09 23:09:04.797 TestApp[4983:4903] The Hangover Part III
    2013-06-09 23:09:04.797 TestApp[4983:4903] 100
    2013-06-09 23:09:04.798 TestApp[4983:4903] hiding spinner...
    2013-06-09 23:09:05.049 TestApp[4983:c07] movie added!
    2013-06-09 23:09:05.051 TestApp[4983:c07] movie added!
    2013-06-09 23:09:05.053 TestApp[4983:c07] movie added!
    2013-06-09 23:09:05.070 TestApp[4983:c07] movie added!
    2013-06-09 23:09:05.287 TestApp[4983:c07] movie added!
    

    (再次,hideSpinnerDownloadingMovies方法在fetchDataWithBlock完成之前执行 - 我刚刚再次运行它,它看起来很像上面的日志,添加了2个“电影!”在“隐藏微调器......”之后)

    以下是我读过并试过的其他一些页面: (我希望我可以发布链接,但似乎我需要10个声誉才能这样做...显然,你没有得到这些链接 - 仅供参考,他们来自fieryrobot.com和其他一些stackoverflow.com页面)

    我只是希望能够找到/保存UI以便UI不会冻结(因此,在后台),并且只有在所有查找/保存操作完成后才能执行某些操作(显示基于的统计信息)操作等)。我不认为我要求太多了?

    我认为答案在于使用Parse.com的API(阻止或非阻止)以及Apple的Grand Central Dispatch的正确组合。但那种神奇的,神秘的组合使我望而却步。

    结论:在执行另一段独立的代码之前,任何人都可以提供执行所有Parse.com查找/保存操作的代码示例吗?

    这一定是可能的,否则您怎么能向用户报告有关操作等的准确统计数据?其他人如何实现这一目标?

    我在智慧结束......

1 个答案:

答案 0 :(得分:0)

  

为什么这么难?!

因为这里的正确抽象级别是NSOperation,它会向GCD添加有用的功能,例如依赖性。请参阅my answer in Best way to manage many block calls