从用户照片库加载图像并更新UICollectionView

时间:2015-01-13 19:16:17

标签: ios objective-c alassetslibrary

所以我有UICollectionView。我需要从他的照片库中获取所有用户照片,并在加载照片时更新我的​​收藏视图。我尝试使用NSNotificationCenter。我将观察者添加到UICollectionViewController,当我枚举照片时,我发布了通知,这样我就可以在加载照片时更新我的​​收藏视图。这是我的控制器:

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(phonePhotoLoaded:) name:@"PhonePhotoLoaded" object:nil];
    [self.manager getPhonePhotos];

选择器方法:

-(void)phonePhotoLoaded:(NSNotification *)userInfo
{
[self.collectionView performBatchUpdates:^{
    NSDictionary *dic = [userInfo valueForKey:@"userInfo"];
    [self.photos addObject:[dic valueForKey:@"photo"]];
    [self.collectionView insertItemsAtIndexPaths:@[[NSIndexPath indexPathForItem:self.photos.count inSection:0]]];
} completion:^(BOOL finished){ 
}];
     

}

并在[self.manager getPhonePhotos]

ALAssetsLibrary *al = [PhotoManager defaultAssetsLibrary];
[al enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos
                  usingBlock:^(ALAssetsGroup *group, BOOL *stop){
                      [group enumerateAssetsUsingBlock:^(ALAsset *asset, NSUInteger index, BOOL *stop){
                          if ([[asset valueForProperty:ALAssetPropertyType] isEqualToString:ALAssetTypePhoto]) {
                                  NSDictionary *userPhotos = [NSDictionary dictionaryWithObjectsAndKeys:asset, @"photo", nil];
                                  [[NSNotificationCenter defaultCenter] postNotificationName:@"PhonePhotoLoaded" object:self userInfo:userPhotos];
                          }
                      }];
     }failureBlock:^(NSError *error) {           
    ;}
 ];

这是我得到的错误:

  

***由于未捕获的异常终止应用' NSInternalInconsistencyException',原因:'在一个视图上更新动画太多 - 一次飞行限制为31;(;}; layer => ;)'

因此,据我所知,当我枚举照片时,我发布通知,然后执行通知方法,但UICollectionView没有制作动画。当我完成枚举时,他会以某种方式启动它们。那么如何在获取照片时更新我的​​UI?有什么想法吗?

1 个答案:

答案 0 :(得分:0)

不要在照片枚举的每次迭代上发布通知(每次调用您的块时)。相反,建立一个包含所有资产的数组并在块的最后一次调用时将其发布(IIRC,最后一次调用时资产将为零,需要检查文档)。

您当前的问题是,您每次发布通知都会启动大量动画,您应该真正整理所有更改,然后执行单个performBatchUpdates