Ячейка никогда не должна находиться в анимации обновления (сбой UICollectionView)

#ios #swift #uicollectionview #crash #uikit

#iOS #swift #uicollectionview #сбой #uikit

Вопрос:

У меня есть ячейка, которая никогда не должна находиться в анимации обновления сбой в UICollectionView, о котором сообщает crashlytics. Этот сбой происходит только для пользователей iOS 14. Это не было заметно, когда приложение использовало SDK iOS 13 (это затронуло менее 0,01% всех пользователей). Но после поддержки SDK iOS 14 частота сбоев заметно увеличилась почти до 0,25% от всех пользователей. Внутренне UICollectionView, насколько я понимаю (из некоторого пути разборки UIKit), перебирает видимые ячейки и проверяет, что счетчик анимации ячеек равен нулю (иначе он вылетает со следующей трассировкой стека). Это не точно, но, по-видимому, сбой происходит во время performBatchUpdates (_: завершение:) Я не смог воспроизвести эту ошибку, и я не могу тратить больше времени на изучение дизассемблированного кода UIKitCore, чтобы понять, когда и почему изменяется этот счетчик анимации.

 Fatal Exception: NSInternalInconsistencyException
0  CoreFoundation                 0x1915e9114 __exceptionPreprocess
1  libobjc.A.dylib                0x1a4e0fcb4 objc_exception_throw
2  CoreFoundation                 0x1914f8308 -[CFPrefsSearchListSource addManagedSourceForIdentifier:user:]
3  Foundation                     0x1927dc2c8 -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:]
4  UIKitCore                      0x1935b8548 __43-[UICollectionView _updateVisibleCellsNow:]_block_invoke_4.1070
5  UIKitCore                      0x1935b8000 __43-[UICollectionView _updateVisibleCellsNow:]_block_invoke.1053
6  libdispatch.dylib              0x191221298 _dispatch_call_block_and_release
7  libdispatch.dylib              0x191222280 _dispatch_client_callout
8  libdispatch.dylib              0x1911d123c _dispatch_main_queue_callback_4CF$VARIANT$mp
9  CoreFoundation                 0x191568c30 __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__
10 CoreFoundation                 0x1915630e8 __CFRunLoopRun
11 CoreFoundation                 0x191562200 CFRunLoopRunSpecific
12 GraphicsServices               0x1a765d598 GSEventRunModal
13 UIKitCore                      0x193e28004 -[UIApplication _run]
14 UIKitCore                      0x193e2d5d8 UIApplicationMain
15 App                            0x100dd2d1c main   49 (main.m:49)
16 libdyld.dylib                  0x191241598 start
  

Кто-нибудь сталкивался с такой же проблемой? Вы смогли воспроизвести это?

Комментарии:

1. У меня такой же сбой. Те же симптомы, что и у вас (цифры взлетели на iOS 14). К сожалению, я все еще не смог ее воспроизвести.

2. Я наблюдал этот сбой в tvOS 14. то же сообщение об ошибке. Это происходит, когда deleteItems, reloadItems, insertItems внутри performBatchUpdates. Не уверен, в чем настоящая причина.

3. Да, мы обнаружили, что это происходит после updates и до completion вызова performBatchUpdates(_:completion:)

4. Я вижу это и в своем приложении. Вы случайно не используете NSFetchedResultsController для обновления вашего представления коллекции, @MikhailMaslo?

5. @YuriReis Извините за поздний ответ. Возможно, у нас есть настройка contentOffset, но мы не смогли найти связь между этим сбоем и программным изменением contentOffset (хотя мы не проверяли этот случай тщательно). Кроме того, мы заметили, что, похоже, в iOS 14.2 эта проблема была решена (ни один пользователь не пострадал в iOS 14.2). Так что, возможно, мы будем терпеливо ждать, когда все пользователи обновятся до более новых версий iOS