[PHCollectionList canContainCustomKeyAssets]:发送到实例的无法识别的选择器

Wil*_* GP 3 objective-c ios phasset

现在,在最新版本的 iOS(iOS 9.2 和 iOS 9.3)上,获取 PHAssets 会崩溃。以前效果很好。

我收到的错误是:

[PHCollectionList canContainCustomKeyAssets]:无法识别的选择器发送到实例由于未捕获的异常“NSInvalidArgumentException”而终止应用程序

抛出异常的行是:

            PHFetchResult *fetchImage = [PHAsset fetchKeyAssetsInAssetCollection:(PHAssetCollection*)collection options:fetchOptions];
Run Code Online (Sandbox Code Playgroud)

这里有更多代码,供参考:

Class PHPhotoLibrary_class = NSClassFromString(@"PHPhotoLibrary");
        if (PHPhotoLibrary_class) {

            PHFetchResult *fetchResult = self.collectionsFetchResults[indexPath.section];
            PHCollection *collection = fetchResult[indexPath.row];

            cell.textLabel.text = collection.localizedTitle;

            PHFetchOptions *fetchOptions = [[PHFetchOptions alloc] init];
            fetchOptions.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:YES]];
            PHFetchResult *fetchImage = [PHAsset fetchKeyAssetsInAssetCollection:(PHAssetCollection*)collection options:fetchOptions];
            PHAsset *asset = [fetchImage firstObject];

            PHImageRequestOptions *options = [[PHImageRequestOptions alloc] init];
            options.resizeMode = PHImageRequestOptionsResizeModeExact;

            CGFloat scale = [UIScreen mainScreen].scale;
            CGFloat dimension = 90.0;
            CGSize size = CGSizeMake(dimension*scale, dimension*scale);

            [[PHImageManager defaultManager] requestImageForAsset:asset
                                                       targetSize:size
                                                      contentMode:PHImageContentModeAspectFill
                                                          options:options
                                                    resultHandler:^(UIImage *result, NSDictionary *info) {
                                                        if (result) {
                                                            CGSize itemSize = CGSizeMake(60, 60);
                                                            UIGraphicsBeginImageContextWithOptions(itemSize, NO, 2);
                                                            CGRect imageRect = CGRectMake(0.0, 0.0, itemSize.width, itemSize.height);
                                                            [result drawInRect:imageRect];
                                                            cell.imageView.image  = UIGraphicsGetImageFromCurrentImageContext();
                                                            UIGraphicsEndImageContext();
                                                        }
                                                        else{
                                                            UIImage *placeholder = [UIImage imageNamed:@"image-placeholder.jpg"];
                                                            CGSize itemSize = CGSizeMake(60, 60);
                                                            UIGraphicsBeginImageContextWithOptions(itemSize, NO, 2);
                                                            CGRect imageRect = CGRectMake(0.0, 0.0, itemSize.width, itemSize.height);
                                                            [placeholder drawInRect:imageRect];
                                                            cell.imageView.image  = UIGraphicsGetImageFromCurrentImageContext();
                                                            UIGraphicsEndImageContext();
                                                        }
                                                    }];
        }
Run Code Online (Sandbox Code Playgroud)

Wil*_* GP 6

这个问题其实就出在这里:

PHCollection *collection = fetchResult[indexPath.row];
Run Code Online (Sandbox Code Playgroud)

然后在这里:

PHAsset *asset = [fetchImage firstObject];
Run Code Online (Sandbox Code Playgroud)

您正在使用获取集合PHCollection,然后假设所有资产都PHAssets没有正确检查是否是这种情况。

实际上,PHCollection 有两个可能的子类PHAssetPHCollectionList,这PHCollectionList就是这里抛出错误的原因。

PHCollection *collection = fetchResult[indexPath.row];检查后包装代码PHAsset,它应该可以解决问题:

if ([collection isKindOfClass:[PHAssetCollection class]]) {
//code 
}
Run Code Online (Sandbox Code Playgroud)