PHImageManager requestImageForAsset:不起作用

时间:2014-12-13 20:48:51

标签: ios7 photos

我有一个组织文字笔记的应用程序。我正在添加允许将照片添加到(UITextView)注释的功能。我添加了一个子类UICollectionViewController来显示用户照片,他们可以从中选择一个插入到他们的笔记中。

下面的UICollectionView委托方法用于使用照片填充集合视图。我已经使用apps桌面图标作为'photoImage'的测试图像测试了这个视图控制器,并且一切正常。

- (UICollectionViewCell *)collectionView:(UICollectionView *)cv cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    PHAsset *asset = (PHAsset *)[fetchResult objectAtIndex:indexPath.row];
    PHImageRequestOptions *options = [[PHImageRequestOptions alloc] init];
    options.deliveryMode = PHImageRequestOptionsDeliveryModeFastFormat;
    options.synchronous = YES;
    NSLog(@" **** calling requestImageForAsset");
    __block UIImage *photoImage;
    __block dispatch_semaphore_t sema = dispatch_semaphore_create(0);
    (void) [[PHImageManager defaultManager] requestImageForAsset:asset targetSize:CGSizeMake(80.0,80.0) contentMode:PHImageContentModeAspectFit options:options
                   resultHandler:^(UIImage *img, NSDictionary *info)
                          {
                            NSError *e = [info objectForKey:PHImageErrorKey];
                            NSLog(@" **** error code (%ld), descr (%@)", (long)e.code, e.localizedDescription);
                            NSLog(@" **** img (%p)", img);
                            photoImage = img;
                            dispatch_semaphore_signal(sema);
                          }
          ];
    NSLog(@" **** returned from requestImageForAsset");
    dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
    dispatch_release(sema);
    UIImageView *photoView = [[UIImageView alloc] initWithImage:photoImage];    <=== Thread 1: EXC_BAD_ACCESS (code=1, address=0x18)
    UICollectionViewCell *cell = [cv dequeueReusableCellWithReuseIdentifier:@"Photo" forIndexPath:indexPath];
    [cell.contentView addSubview:photoView];

    return cell;

}

我的问题出在requestImageForAsset:call的resultHandler中。显示NSLog()输出的Xcode日志如下所示。

2014-12-13 13:18:18.918 iFilebox [23637:866056] ****调用requestImageForAsset 2014-12-13 13:18:18.939 iFilebox [23637:866056] ****错误代码(0),descr((null))&lt; ===没有错误报告2014-12-13 13:18:18.939 iFilebox [23637:866056] **** img(0x7fb4a97b6580)&lt; ===这是一个有效的内存地址吗? 2014-12-13 13:18:19.940 iFilebox [23637:866056] ****从requestImageForAsset返回

在我想要获取所获取的图像并将其添加到集合视图单元格的位置,您可以看到问题:EXC_BAD_ACCESS。我尝试了几种变体作为解决方法无济于事。同样,如果我使用已知的静态图像代替从resultHandler返回的引用图像,则此代码可以正常工作。

有人可以解释为什么这段代码不起作用,如果它应该=,为什么不呢?有没有人对解决方法有任何想法?

1 个答案:

答案 0 :(得分:0)

即使你设置了同步我想知道它是否到达你想要实例化你的UIImage photoView的行,然后它实际上完成了你标记img的结果。尝试将img设置为requestImageForAsset的完成块中的cell.backgroundView,看看是否有效。

此外,也许它只是偏好,但我会先实例化你的细胞,然后才能做到这一点。实际上,您可能希望对单元格进行子类化并将图像设置在子类中。