0

Ich bin auf ein seltsames Problem gestoßen, an dem ich lange gearbeitet habe.Warum werden Variablen außerhalb des Asset-Library-Blocks nicht beibehalten?

Ich bin im Grunde versucht, den Dateipfad eines Fotos aus der Asset-Bibliothek zu erhalten und es auf einem pdf zieht die CGRectMake Methode unter Verwendung des Codes:

In der H-Datei:

@property (strong, nonatomic) UIImage *pdfSnagImage; 

In der .m-Datei:

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)]; 

Was ist passiert, dass die UIImage nach dem Block wird Testbilder tatsächlich vor dem Block aufgelöst werden - daher ist es Null ist, als self.pdfIm Alter wird nur innerhalb des Blocks festgelegt.

Wenn ich diese Codezeilen in den Block einfüge, erhalte ich einen Fehler mit der CGRectMake-Methode, ungültiger Kontext 0x0.

Wie kann ich das self.pdfImage UIImage zuerst zuweisen und dann zeichnen?

+0

In welchen Kontext zeichnen Sie? Die Methode 'assetForURL: resultBlock: failureBlock:' kehrt sofort zurück und geht dann asynchron vor dem Aufruf des Codes in 'resultBlock' oder 'failureBlock'. Daher müssen Sie Ihre Arbeit in einem dieser Blöcke erledigen. –

+0

Die folgende SO scheint Frage relevant: http://stackoverflow.com/questions/7234445/wait-for-assetforurl-blocks-to-be-completed – lukasz

+0

@ Paul.s Könnten Sie erklären, was Sie meinen, was Kontext zeichne ich ein? – jcrowson

Antwort

1

Der Block wird asynchron ausgeführt ... er wird auf einem separaten Thread ausgeführt. Dies ist das Design der Assets lib api.

Verwandte Themen