私は Xcode 4.6.2 で作業しており、iPhone アプリを開発しようとしています。
私は空き時間にこのオンとオフに何週間も苦労してきました.開発をあきらめ、二度とモバイルアプリを作成しようとしないことを検討しています. 簡単にできるはずのことで意気消沈してしまう...
私がやろうとしているのは次のとおりです。
- Parse.com の API を使用して "findObjects"/"findObjectsInBackgroundWithBlock" & "save"/"saveInBackgroundWithBlock" を取得し、データを保存します。その後
- そのようなすべての操作が完了したら、(実行されたすべての解析操作の結果を完全に把握した上で) その後に何かを行います。
たとえば、for ループを介していくつかのオブジェクトを Parse に保存し、それらをすべて保存した後、成功したもの、失敗したものなどを把握して、それらの数値を画面に表示できるようにしたいと考えています。
また、たとえば、Parse.com でオブジェクトを検索する場合も同じことを行い、検索が完了したら、見つかったアイテムの数、重複の数などを計算して表示したいと思います。 iPhoneの画面)
なんでこんなに難しいの!?
「dispatch_async」や「dispatch_group_async」+「dispatch_group_notify」など、Grand Central Dispatch の多数の例を使用してみました。「WithBlock」Parse.comメソッドとブロックされていないバージョンでGCDを試しました。
サンプルの問題 #1: すべてのアイテムが Parse.com から取得される前にスピナーが非表示になります (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];
});
[ソース]別のブロックを開始する前に、2 つの非同期ブロックが実行されるまで待機する
ログは次のようになります。
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 つの「movie added!」が追加されています)。
私が読んで試した他のいくつかのページは次のとおりです: (リンクを投稿できればいいのにと思いますが、そうするには 10 の評判が必要なようです...どうやら、あなたはそれらのリンクを取得していないようです - 参考までに、それらはfieryrobot.com およびその他のいくつかの stackoverflow.com ページ)
UIがフリーズしないように(バックグラウンドで)検索/保存できるようにしたいだけで、すべての検索/保存操作が完了した後にのみいくつかのことを実行できるようにしたい(操作に基づいて統計を表示し、等。)。求めすぎじゃないのかな?
その答えは、Parse.com の API (ブロックされているかどうかに関係なく) と Apple の Grand Central Dispatch を正しく組み合わせて使用することにあると思います。しかし、その魔法のような神秘的な組み合わせは私には理解できません。
結論: 別の別のコードを実行する前に、Parse.com のすべての検索/保存操作を実行するコード サンプルを提供できる人はいますか?
これは可能でなければなりません。そうでなければ、操作などに関する正確な統計をユーザーに報告することはできませんか? 他の人はこの目標をどのように達成していますか?
私は途方に暮れています...