私は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)としてログ。
私はメインスレッドで呼び出すと、ブロックが終了するまで待つと思っていましたが、そうではありません。
どのように私はブロックが完了するまで待つアプリを得ることができますか?
ブロックが呼び出されるまで待つ方法があります。実行ループを手動で実行し、ブロックに変数が設定されていることを示すだけです。これにより、他のイベントは返されない間に処理されます。 – ughoavgfhw
あなたは*できますが、それは悪い考えです。 AppleはAPIを設計して、これらのタイプの長時間実行される操作がメインスレッドをブロックしないようにします。 'resultBlock'パラメータからメソッドを呼び出すだけで、なぜそのデザインを回避するのでしょうか? –
+1メインスレッドをブロックしないでください! GUIとそのすべて –