ios - 'NSGenericException',原因 : Collection <__NSArrayM: 0x7fabb400> was mutated while being enumerated

标签 ios objective-c

在我的 iPhone 应用程序中,我正在尝试使用 uicollectionView 实现一个图片库。当 <20 张图像存储在图库中时它工作正常但是当我存储多个图像(大于 20 个)时应用程序崩溃。请帮助我。谢谢提前。

错误:

Terminating app due to uncaught exception 'NSGenericException', reason:          '*** Collection <__NSArrayM: 0x7fabb400> was mutated while being enumerated.'
*** First throw call stack:
(
    0   CoreFoundation                      0x042ea946 __exceptionPreprocess + 182
    1   libobjc.A.dylib                     0x03660a97 objc_exception_throw + 44
    2   CoreFoundation                      0x042ea1e6 __NSFastEnumerationMutationHandler + 166
    3   CoreFoundation                      0x041da052 -[NSArray containsObject:] + 178
    4   AtSceneDebug                        0x001ce9a9 -[GalleryCollectionViewController loadImageFromAppSupport:] + 201
    5   AtSceneDebug                        0x001c5de2 __73-[GalleryCollectionViewController collectionView:cellForItemAtIndexPath:]_block_invoke + 98
    6   libdispatch.dylib                   0x03cca30a _dispatch_call_block_and_release + 15
    7   libdispatch.dylib                   0x03ceae2f _dispatch_client_callout + 14
    8   libdispatch.dylib                   0x03cd310f _dispatch_root_queue_drain + 634
    9   libdispatch.dylib                   0x03cd487e _dispatch_worker_thread2 + 45
    10  libsystem_pthread.dylib             0x04056dab _pthread_wqthread + 336
    11  libsystem_pthread.dylib             0x0405acce start_wqthread + 30
)
libc++abi.dylib: terminating with uncaught exception of type NSException

代码:

GalleryCollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"GalleryCollectionViewCellID" forIndexPath:indexPath];

    if(indexPath.row==0)
    {
        Photo *photo=[self.photoSource.photos objectAtIndex:indexPath.row];
        cell.selectionImageView.hidden=YES;
        [cell.galleryImageView setImage:[UIImage imageNamed:[photo.mURLLarge lastPathComponent]]];
        return cell;
    }

    Photo *photo=[self.photoSource.photos objectAtIndex:indexPath.row];

    if(self.mItemType==ITEM_TYPE_PHOTO)

    {
        NSLog(@"index of coll.......%d",indexPath.row);
        UIImage *image = [_imageCache objectForKey:photo.mURLThumb];
      if(image)
        {
           //[cell.galleryImageView setImage:[self loadImageFromAppSupport:photo.mURLLarge]];
          [cell.galleryImageView setImage:image];

        }
      else
      {        
         dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{          
              UIImage *image = [self loadImageFromAppSupport:photo.mURLThumb];
              if(image)
              {
                  dispatch_async(dispatch_get_main_queue(), ^{
                      GalleryCollectionViewCell *cell =(GalleryCollectionViewCell*)[self.collectionView cellForItemAtIndexPath:indexPath];
                      if(cell)
                      {
                          cell.galleryImageView.image = image;
                      }
                  });

                  [_imageCache setObject:image forKey:photo.mURLThumb];
              }
          });

      }
    }

    else

    {
        [cell.galleryImageView setImage:[self loadImageFromAppSupport:photo.mURLThumb]];

    }

    if(indexPath.row==0)
    {
        cell.selectionImageView.hidden=YES;
    }
    else if(self.isEditing && photo.isMarkedForDeletion && indexPath.row!=0)
    {
        cell.selectionImageView.hidden=NO;
        [cell.selectionImageView setImage:[UIImage imageNamed:@"red_led"]];
    }
    else if (self.isEditing && !photo.isMarkedForDeletion && indexPath.row!=0)
    {
        //[cell.selectionImageView setImage:[UIImage imageNamed:@"green_led"]];
        cell.selectionImageView.hidden=YES;
    }
    else if(!self.isEditing && photo.isMarkedForDeletion && indexPath.row!=0)
    {
        cell.selectionImageView.hidden=YES;
    }
    else if(!self.isEditing && !photo.isMarkedForDeletion && indexPath.row!=0)
    {
        cell.selectionImageView.hidden=YES;
    }

    if (!self.isEditing)
    {
        CGFloat xx=cell.frame.origin.x;
        CGFloat yy=cell.frame.origin.y;

        CGRect frame = cell.frame;
        frame.origin.x = 500; // new x coordinate
        frame.origin.y = 0; // new y coordinate
        cell.frame = frame;

                [UIView animateWithDuration:0.0 animations:^{

            CGRect frame = cell.frame;
            frame.origin.x = xx; // new x coordinate
            frame.origin.y = yy; // new y coordinate
            cell.frame = frame;
        }];

    }
    cell.layer.shouldRasterize = YES;
    cell.layer.rasterizationScale = [UIScreen mainScreen].scale;
    return cell;

最佳答案

当您在 2 个不同的线程/队列上使用 NSMutable 并且一个正在枚举一个而另一个正在从中添加/删除元素时,通常会抛出此错误。 你不应该在多线程环境中使用 NSMutableObject。 您的来电:

[_imageCache setObject:image forKey:photo.mURLThumb];

是失败的原因,您正在更改调度队列中的可变对象,同时在主线程中访问它。将此调用移至“if(cell)”部分上方(或 dispatch_get_main_queue block 中的任何其他位置)将解决此问题。

关于ios - 'NSGenericException',原因 : Collection <__NSArrayM: 0x7fabb400> was mutated while being enumerated,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28107809/

相关文章:

objective-c - 如何判断默认的EKCalendar 'Calendar'是否可以隐藏?

ios - 为什么 UITableView 和 UIScrollView 的 bounds 属性中的 "Y"值最初是 "-64"?

ios - AVAudioPlayer 降低帧率

iOS 应用程序在 [ParseCrashReporting 启用] 上崩溃

IOS/objective-C :Animation of Multiple CGAffineTransformations

ios - 保存 UIButton 的状态(复选框)- Swift

ios - 如何从 JSON 解析图像

ios - 接受类型序列的函数

ios - Cocoapods: 没有这样的模块 'CorePlot'

ios - 我可以使用 Swift 获取所有现有的通知中心消息吗?