0

私は年を過ごしたという奇妙な問題に遭遇しました。なぜAsset-Libraryブロックの外に変数が保持されないのですか?

私は基本的には、資産ライブラリから写真のファイルパスを取得し、以下のコードを使用CGRectMakeメソッドを使用してPDFにそれを描画しようとしている:.hファイルで

を:

@property (strong, nonatomic) UIImage *pdfSnagImage; 
.mファイルで

: - したがって、それはself.pdfImとして、Nullの

NSURL *url = [[NSURL alloc] initWithString:pdf.photo]; 
ALAssetsLibrary* library = [[ALAssetsLibrary alloc] init]; 

[library assetForURL:url resultBlock:^(ALAsset *asset) { 

    ALAssetRepresentation *rep = [asset defaultRepresentation];    
    self.filename = [rep filename]; 
    NSLog(@"filename for image is: %@", self.filename); 

    CGImageRef iref = [rep fullResolutionImage]; 
    if (iref) { 
     self.pdfImage = [UIImage imageWithCGImage:iref]; 
     NSLog(@"image height %f", self.pdfImage.size.height); 

    } 

} failureBlock:^(NSError *error) { 

    NSLog(@"Couldn't load asset %@ => %@", error, [error localizedDescription]); 

}]; 

UIImage *testImage = self.pdfImage; 

[testImage drawInRect:CGRectMake((pageSize.width - testImage.size.width/2)/2, 350, testImage.size.width/2, testImage.size.height/2)]; 

何が起こっているがUIImageがブロックした後、testImageが実際にブロックする前に解決されていることです年齢はブロック内でのみ設定されます。

ブロック内にこれらのコード行を挿入すると、CGRectMakeメソッドのInvalid Context 0x0にエラーが発生します。

まず、self.pdfImage UIImageを割り当てることができますか?

+0

あなたはどのようなコンテキストに参加していますか?メソッド 'assetForURL:resultBlock:failureBlock:'は直ちに戻り、 'resultBlock'または' failureBlock'のいずれかでコードを呼び出す前に非同期で動作します。したがって、それらのブロックのいずれかの内部で作業をする必要があります。 –

+0

次SOの質問は、関連すると思われる: http://stackoverflow.com/questions/7234445/wait-for-assetforurl-blocks-to-be-completed – lukasz

+0

@ Paul.sあなたは何によって何を意味するか説明してもらえ文脈が描かれていますか? – jcrowson

答えて

1

ブロックは非同期で実行されます...別のスレッドで実行されています。これは、資産のlib apiの設計です。

関連する問題