2012-02-13 7 views
2

enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:^(ALAssetsGroup *group, BOOL *stop)などのALAssetsLibrary APIからの非同期ブロックを使用しているとします。まず、ブロックが非同期であるため、システムは別の実行スレッドでブロックを自動的に実行しますか?もしそうなら、いつブロックが完了するかを知る最良の方法は、UIActivityIndicatorが回転したり、UITableViewをリロードしたりするのを止めるような行動をとることができます。アニメーションが完了したら何らかのアクションを実行できるようにする完了ブロックを持つanimateWithDurationブロックのようなIE。ここで似たようなことをするパターンは何ですか?非同期ブロックが与えられたとき、ブロックがいつ完了するかを知る方法は?

答えて

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をロックアップできるコードは、バックグラウンドでまだ実行されています。この特定のケースでは、その機能が「空気のために戻ってくる」ことと、与えられたグループのために何をしたいかを尋ねることが多く、それはバックグラウンドで戻ります。

+0

ありがとうございました。では、非同期メソッド内のブロックは、通常、メインスレッドで呼び出されることを意味しますか?また、あなたが言っていることの後半部分を行うための構文を知っていますか?つまり、ブロックがnilであるかどうかをチェックしますか?私はそれがブロックの外側で行われるべきだと考えていますが、ブロックがゼロになるのを待っているだけで、非同期スレッドの利点を否定するのではないのですか? –

+1

バックグラウンドスレッドでブロックを実行できますが(NSThread performBlockInBackgroundが行います)、これらのAPI関数のほとんどのブロックポイントは、非同期実行の制御を可能にすることです。たとえば、アニメーションAPIは、メインスレッドで補完ブロックを戻します。私はAPIのこのセットに慣れていません、なぜあなたは確かめるためにチェックしないでください。 NSLog()の[NSThread isMainThread]を使用して、メインスレッド上にあるかブロック呼び出し中でないかを表示します。 – MGA

+0

奇妙な慣習(少なくともこの場合は、同期呼び出しがほとんどのユーザーにとってより便利になる可能性があります)。しかし、私は、実装の面では、 'nil' sigilで偽の反復処理を行うよりも、直接的な代替案はないと思います。 – aroth

関連する問題