#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