2012-03-21 32 views
1

私はUIImagePickerControllerで画像を取得しています.GPSメタデータがあるかどうかを確認する必要があります。このコードはそれを引き出しますが、私はブロックのタイミングに問題があります。私はassetLibraryでブロックを使用しているので、後で完了します(abit、数分の1秒)。ブロックで問題が終了するのを待つ

if ([info objectForKey:UIImagePickerControllerReferenceURL]) 
{ 
    [self performSelectorOnMainThread:@selector(testMethod:) withObject:[info objectForKey:UIImagePickerControllerReferenceURL] waitUntilDone:YES]; 

    NSLog(@"self.metadataDictionary back in impagepickerdidfinish: %@", self.metadataDictionary); 
} 

}

-(void)testMethod:(NSURL *) photoURL 
{   
     ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init]; 

     [library assetForURL:photoURL resultBlock:^(ALAsset *asset) { 
      ALAssetRepresentation *representation = [asset defaultRepresentation]; 
      NSDictionary *metadataDict = [representation metadata]; 
      self.metadataDictionary = metadataDict; 
      NSLog(@"self.metadataDictionary in block: %@", self.metadataDictionary); 

     } failureBlock:^(NSError *error) { 
      NSLog(@"%@",[error description]); 
     }]; 
} 

NSLog(@"self.metadataDictionary back in impagepickerdidfinish: %@", self.metadataDictionary); 

2012-03-21 16:40:47.110[9387:707] self.metadataDictionary back in impagepickerdidfinish: (null) 
2012-03-21 16:40:47.265[9387:707] self.metadataDictionary in block: { 
    ColorModel = RGB; 
} 

ランブロックの前の行が完了し、(NULL)としてログ。

私はメインスレッドで呼び出すと、ブロックが終了するまで待つと思っていましたが、そうではありません。

どのように私はブロックが完了するまで待つアプリを得ることができますか?

答えて

2

assetForURL:resultBlock:failureBlock:は、NSArrayenumerateObjectsUsingBlock:のように同期して呼び出されません。 dispatch_asyncのようなものです。ブロックが呼び出されますが、必ずしもすぐに呼び出されるわけではありません。

あなたのアプリケーションの残りの部分にすべてが終了したことを知らせるために結果ブロックが呼び出す別のメソッドを作成します。ユーザーが確認または拒否しながら、あなたはブロックされ、メインスレッドの残りの部分を望んでいない

When the ALAsset is requested, the user may be asked to confirm the application's access to the data. 

:ともあるはずです - Iを完了するまで、このコールブロックスレッドを作るためにどのような方法があると信じていません。アプリケーションへのアクセス。これが非同期呼び出しの理由です。

+0

ブロックが呼び出されるまで待つ方法があります。実行ループを手動で実行し、ブロックに変数が設定されていることを示すだけです。これにより、他のイベントは返されない間に処理されます。 – ughoavgfhw

+1

あなたは*できますが、それは悪い考えです。 AppleはAPIを設計して、これらのタイプの長時間実行される操作がメインスレッドをブロックしないようにします。 'resultBlock'パラメータからメソッドを呼び出すだけで、なぜそのデザインを回避するのでしょうか? –

+0

+1メインスレッドをブロックしないでください! GUIとそのすべて –

関連する問題