I've got this UICollectionView
set up with a fetched results controller, using core data. I use UIImagePickerController
to add items to the UICollectionView
. Now when I tap one of the photos stored on my device, it will be added to my managed object context and will be inserted into the UICollectionView
.
Now when I quickly add multiple items, the app crashes with the following error:
2012-10-07 13:17:46.770 PhotoLibrary[2444:907] *** Assertion failure in -[UICollectionView _endItemAnimations], /SourceCache/UIKit/UIKit-2372/UICollectionView.m:2801
It seems like it can't handle adding an item while the animation of the previous added item hasn't ended yet. Just happens when you add them really quickly, but some of the users will do that.
Is there a good way to just wait and add the item when the other one is finished? Users should be able to add them "real time", so I can't just run all the changes at once.
The error only occurred when adding a few items quickly. But the real problem wasn't really related to the animation. I was creating the managed objects used to store the new items in a block, used in the ALAssetsLibrary
's assetForURL:resultBlock:
method.
Took a while to figure out that that was the problem, the managed objects were created in a separate thread. Turns out that managed objects doesn't handle that well.
Now moved the creation of the new items outside of the block, now it just works fine.
Without example code, I'm presuming the problem occurs when calling the - (void)reloadData
method after inserting data into the UICollectionView
. The documentation for this method explicitly calls out the fact you shouldn't call this method in the middle of an animation caused by insertion/deletion since the insertion/deletion will invoke the animation code automatically.
Some other notable methods are - (void)insertItemsAtIndexPath:(NSArray *)indexPaths
and - (void)performBatchUpdates:(void (^)(void))updates completion:(void (^)(BOOL finished))completion
. I have not used the batch method, but I've used the insert method a number of times and it works well.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With