如果更改了数据源,如何停止运行cellForItemAtIndexPath

时间:2014-08-18 09:02:07

标签: ios objective-c uicollectionview

我从ALAssetLibrary收集照片并将其显示在UICollectionView中。我添加了一个名为ALAssetsLibraryChangedNotification的通知来处理照片更改,并在发布通知时调用showLatestPhotos。 我的照片收集功能如下:

- (void)showLatestPhotos {
    _latestPhotos = [NSMutableArray array];
    // get photo from asset and inset into _latestPhotos
    [_latestPhotos insertObject:...];
    [_collectionView reloadData];
}

问题在于,如果我执行屏幕截图(同时单击主页和电源),ALAssetsLibraryChangedNotification将发布两次以上,即showLatestPhtots将执行两次,第二次_latestPhotos设置为空时使用_latestPhotos = [NSMutableArray array],第一次调用中由cellForItemAtIndexPath触发的collectionView's数据源的[_collectionView reloadData]仍然被调用,当它调用[_latestPhotos objectAtIndex:],时,应用程序崩溃。有谁知道如何解决这个错误?

2 个答案:

答案 0 :(得分:0)

使用它可以使用

if ([_latestPhotos containsObject:yourobject] == NO) 
{
   // Do something
   _latestPhotos = [NSMutableArray array];
   // get photo from asset and inset into _latestPhotos
   [_latestPhotos insertObject:...];
   [_collectionView reloadData];
}

答案 1 :(得分:0)

我终于找到了解决方案。由于单个照片更改(例如屏幕截图)触发的ALAssetsLibraryChangedNotification的时间间隔大约为0.1秒,我只是等待它们全部到达并使用performSelector: withObject: afterDelay:执行showLatestPhotos一次并使用{{1取消先前不必要的调用无论如何,谢谢你回答我的问题。