为什么不在Asset-Library块之外保留变量?

时间:2012-04-02 23:21:32

标签: objective-c ios core-data objective-c-blocks alassetslibrary

我遇到了一个奇怪的问题,我已经花了很多年的时间。

我基本上试图从资产库中获取照片的文件路径,并使用CGRectMake方法使用以下代码在pdf上绘制它:

在.h文件中:

@property (strong, nonatomic) UIImage *pdfSnagImage;

在.m文件中:

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实际上是在块之前解析的 - 因此它是Null,因为self.pdfImage只在块中设置。

如果我将这些代码行放在块中,我会收到CGRectMake方法的错误,无效的上下文0x0。

我怎样才能首先分配self.pdfImage UIImage然后绘制它?

1 个答案:

答案 0 :(得分:1)

该块以异步方式执行...它在一个单独的线程上执行。这是资产lib api的设计。