enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:^(ALAssetsGroup *group, BOOL *stop)
などのALAssetsLibrary
APIからの非同期ブロックを使用しているとします。まず、ブロックが非同期であるため、システムは別の実行スレッドでブロックを自動的に実行しますか?もしそうなら、いつブロックが完了するかを知る最良の方法は、UIActivityIndicator
が回転したり、UITableView
をリロードしたりするのを止めるような行動をとることができます。アニメーションが完了したら何らかのアクションを実行できるようにする完了ブロックを持つanimateWithDuration
ブロックのようなIE。ここで似たようなことをするパターンは何ですか?非同期ブロックが与えられたとき、ブロックがいつ完了するかを知る方法は?
2
A
答えて
5
ブロックは通常、メインスレッドで実行されます。呼び出している関数は非同期部分です。このブロックは、非同期に呼び出された関数がいつ完了したかを知るためによく使われます。この特定のケースでは、reference materialを簡単に見てみましょう。
順番に各アセットを使用して呼び出すブロック。列挙型が の場合、enumerationBlockはグループをnilに設定して呼び出されます。
だから、この場合はゼロを探してください!
EDIT:
この
ALAssetsLibrary *lib = [ALAssetsLibrary new];
[lib enumerateGroupsWithTypes:ALAssetsGroupAll
usingBlock:^(ALAssetsGroup *group, BOOL *stop) {
if (group == nil) {
NSLog(@"Done!");
}
}
failureBlock:^(NSError *error) {
NSLog(@"Failed...");
}
];
ような何かをしようとnilをチェックするために、あなたがメインスレッド上currentyされているかどうかを確認したい場合に使用することができます:
NSLog("On main thread : %d",[NSThread isMainThread] ? 1:0);
このようなAPI呼び出しでは、ブロックはメインスレッド上で実行されます。なぜなら、それらは関数の「重い部分」ではないからです。潜在的にあなたのUIをロックアップできるコードは、バックグラウンドでまだ実行されています。この特定のケースでは、その機能が「空気のために戻ってくる」ことと、与えられたグループのために何をしたいかを尋ねることが多く、それはバックグラウンドで戻ります。
関連する問題
- 1. 完了ブロック内で非同期コールが終了するのを待つ
- 2. 非同期要求が応答を完了したことを知る方法。
- 3. ブロックが与えられたときにのみブロックを渡す別の方法はありますか?
- 4. 完了ブロックが完了したらメソッドを呼び出す方法は?
- 5. 非同期ブロック
- 6. ブロック非同期タスク
- 7. 非同期操作が同期して完了したら?
- 8. iOSはブロックが完了するまでブロックします
- 9. 非同期要求が完了するまでブロックjsが実行されます
- 10. 非同期ブロックが実行された後に関数が返ることを確認する方法は?
- 11. クロージャを使用して非同期要求が完了したときを知る方法?
- 12. ブロック非同期/待機ボタンUIブロック
- 13. 与えられた文字列を含む各ブロックを見つける方法
- 14. 非同期再帰アクティビティがいつ終了したかを知るには?
- 15. 終了ビューの完了ブロックが実行されると、 Swift
- 16. 完了ブロックの値を返す方法
- 17. dispatch_asyncブロックで同期NSURLConnectionをラップすると非同期接続
- 18. Firebasequeryが完了する前にAndroid非同期タスクが完了しました
- 19. テスト前に非同期ngOninitが完了するのを待つ方法
- 20. 機能非同期/非ブロック化の方法に関するガイダンスが必要
- 21. のPython 3.5 aiohttpブロック非同期/待つ
- 22. 非同期のajax要求が完了するのを待つ
- 23. 非同期コードが完了するのを待つSwift
- 24. 非同期要求が完了するのを待つ
- 25. SDWebImage完了ブロック
- 26. svnの同期をブロックする方法
- 27. 私の非同期コントローラがブロックされているのはなぜですか?
- 28. 非同期ReadDirectoryChangesW通話ブロック
- 29. すべての非同期/待機が完了したことを知る方法?
- 30. 非同期操作をブロックする慣用方法
ありがとうございました。では、非同期メソッド内のブロックは、通常、メインスレッドで呼び出されることを意味しますか?また、あなたが言っていることの後半部分を行うための構文を知っていますか?つまり、ブロックがnilであるかどうかをチェックしますか?私はそれがブロックの外側で行われるべきだと考えていますが、ブロックがゼロになるのを待っているだけで、非同期スレッドの利点を否定するのではないのですか? –
バックグラウンドスレッドでブロックを実行できますが(NSThread performBlockInBackgroundが行います)、これらのAPI関数のほとんどのブロックポイントは、非同期実行の制御を可能にすることです。たとえば、アニメーションAPIは、メインスレッドで補完ブロックを戻します。私はAPIのこのセットに慣れていません、なぜあなたは確かめるためにチェックしないでください。 NSLog()の[NSThread isMainThread]を使用して、メインスレッド上にあるかブロック呼び出し中でないかを表示します。 – MGA
奇妙な慣習(少なくともこの場合は、同期呼び出しがほとんどのユーザーにとってより便利になる可能性があります)。しかし、私は、実装の面では、 'nil' sigilで偽の反復処理を行うよりも、直接的な代替案はないと思います。 – aroth