Лучший способ использовать PHPhotoLibrary для отображения изображения Camera Roll в UICollectionView с пользовательской ячейкой

Привет всем, у меня проблема с моим приложением ... В моем контроллере просмотра hp CollectionView с пользовательской ячейкой, которая должна возвращать все фотографии в разделе «Фотопленка» изображений приложения моего iphone.

Теперь я сделал все шаги, чтобы показать фотографии в ImageView в пользовательской ячейке, и до сих пор у меня нет проблем ... Моя проблема в том, что когда я начинаю прокручивать фотографии, загрузка фотографий происходит очень медленно и сразу после приложение вылетает, возвращая мне эту ошибку в журнале..

[GatekeeperXPC] Соединение с assetsd было прервано или assetsd умер 25.02.2017 20: [Generic] Создание формата образа с неизвестным типом является ошибкой

Можете ли вы сказать мне, правильно ли я выбрал способ отображения фотографий в моем представлении коллекции? Где я ошибся? потому что мое приложение вылетает?

Спасибо всем за любую помощь, которую вы можете мне оказать

Это код, который я использую

- (void)viewDidLoad {
    [super viewDidLoad];
    self.nameTextField.delegate = self;
    self.emailTextField.delegate = self;
    self.passwordTextField.delegate = self;
    self.collectionView.delegate = self;
    self.collectionView.dataSource = self;
    _collectionView.backgroundColor = [UIColor clearColor];
}

-(void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    [_nameTextField becomeFirstResponder];
    [self queryImage];


 }

-(void)queryImage {
    PHFetchOptions *fetchOptions = [[PHFetchOptions alloc] init];

    PHFetchResult *collection = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeSmartAlbumUserLibrary options:fetchOptions];

    if (collection.firstObject != nil ) {
        _photoFound = YES;
        _assetCollection = collection.firstObject;

    } else {

    }

    _photoAsset = [PHAsset fetchAssetsInAssetCollection:_assetCollection options:nil];
    [_collectionView reloadData];
}

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
    return CGSizeMake(80,80);
}

-(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {

    NSUInteger count = 0;
    if (_photoAsset != nil) {
        count = [_photoAsset count];
    }
    return count;
}

- (UICollectionViewCell *)collectionView:(UICollectionView *)cv cellForItemAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *reuseIdentifier = @"imageCell";

    UPCameraRollCollectionViewCell* cell = [cv dequeueReusableCellWithReuseIdentifier:reuseIdentifier forIndexPath:indexPath];
    cell.backgroundColor = [UIColor redColor];


    PHAsset *asset = [_photoAsset objectAtIndex:indexPath.item];

PHImageManager *imageManager = [PHImageManager defaultManager];
    [imageManager requestImageForAsset:asset targetSize:PHImageManagerMaximumSize contentMode:PHImageContentModeAspectFill options:nil resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) {

[cell setThumbnailImage:result];

}];


    return cell;
}

person kAiN    schedule 25.02.2017    source источник


Ответы (1)


Используйте PHCachingImageManager.

У Apple есть пример, который точно показывает, как делать то, что вам нужно. Представления коллекций — это как раз предполагаемый вариант использования.

person matt    schedule 25.02.2017
comment
Не могли бы вы привести пример моего кода, чтобы лучше понять? Я даже никогда не пользовался PHPhotolibrary, это совершенно новое для меня приложение. - person kAiN; 25.02.2017
comment
Это как в том анекдоте, да, где Бог говорит, чувак, я уже послал тебе две лодки и вертолет... Смотри документы! Посмотрите на пример! - person matt; 26.02.2017