我正在使用Xcode 4.6.2,尝试开发iPhone应用程序。
在我的业余时间里,我一直在努力工作几周,而且我正在考虑放弃开发并且从不尝试再次创建移动应用程序。我应该做一件容易的事情,这让我非常沮丧......
我所要做的就是:
例如,我想通过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查找/保存操作的代码示例吗?
这一定是可能的,否则您怎么能向用户报告有关操作等的准确统计数据?其他人如何实现这一目标?
我在智慧结束......
答案 0 :(得分:0)
为什么这么难?!
因为这里的正确抽象级别是NSOperation
,它会向GCD添加有用的功能,例如依赖性。请参阅my answer in Best way to manage many block calls。