在 viewWillTransitionToSize 中崩溃
Crash in viewWillTransitionToSize
我正在开发一个针对 iOS 8.0+ 的应用程序,使用 Swift 2.2 和 Realm 1.0.2 作为我的数据存储。
我在崩溃日志中看到很多与此代码相关的崩溃,尽管我目前无法自己重现它们:
/// Resize cells when orientation changes.
override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
if visible {
dispatch_async(dispatch_get_main_queue()) {
if let coordinator = coordinator as UIViewControllerTransitionCoordinator? {
if self.collectionView != nil {
self.collectionView.reloadData()
coordinator.animateAlongsideTransition({ context in
self.collectionView.performBatchUpdates(nil, completion: nil)
}, completion: nil)
}
}
}
}
}
此代码出现在包含 UICollectionView
的视图控制器中,该视图控制器根据方向显示不同大小的单元格。我不清楚为什么我需要 self.collectionView.reloadData()
在动画之前,但没有它,边距比预期的要宽得多。
这是我得到的轨迹:
0 libobjc.A.dylib 0x0000000180f400b0 objc_retain + 16 (objc-object.h:341)
1 UIKit 0x00000001873a1570 -[_UIViewControllerTransitionCoordinator _animateAlongsideTransitionInView:systemCompletion:animation:completion:] + 112 (UIViewControllerTransitioning.m:865)
2 UIKit 0x0000000186b17f40 -[_UIViewControllerTransitionCoordinator animateAlongsideTransition:completion:] + 68 (UIViewControllerTransitioning.m:906)
3 MyApp 0x00000001000fc78c 0x1000c0000 + 247692
4 libdispatch.dylib 0x000000018130d4bc _dispatch_call_block_and_release + 24 (init.c:760)
5 libdispatch.dylib 0x000000018130d47c _dispatch_client_callout + 16 (object.m:506)
6 libdispatch.dylib 0x0000000181312b84 _dispatch_main_queue_callback_4CF + 1844 (inline_internal.h:1063)
7 CoreFoundation 0x0000000181878d50 __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 12 (CFRunLoop.c:1613)
8 CoreFoundation 0x0000000181876bb8 __CFRunLoopRun + 1628 (CFRunLoop.c:2718)
9 CoreFoundation 0x00000001817a0c50 CFRunLoopRunSpecific + 384 (CFRunLoop.c:2814)
10 GraphicsServices 0x0000000183088088 GSEventRunModal + 180 (GSEvent.c:2245)
11 UIKit 0x0000000186a82088 UIApplicationMain + 204 (UIApplication.m:3772)
12 MyApp 0x00000001000c92d8 0x1000c0000 + 37592
13 libdyld.dylib 0x000000018133e8b8 start + 4 (start_glue.s:78)
我曾经能够通过更改另一个屏幕上的方向然后快速返回到 UICollectionView
的屏幕来触发类似的崩溃。 if visible
检查似乎解决了这个问题,我得到的这些崩溃少了很多,但仍然有一些。任何关于在我的代码中查找问题的位置或阅读这些跟踪的资源的任何想法都将不胜感激。
这里有几个小问题:
- 始终在 UIViewController 生命周期方法中调用
super
- GCD 调用可能会导致意外的不一致
请记住,dispatch_async
仅使用 GCD 安排您的代码块,并不保证它何时执行。该块完全有可能在动画开始后执行,从而使大小转换处于不一致状态。
我正在开发一个针对 iOS 8.0+ 的应用程序,使用 Swift 2.2 和 Realm 1.0.2 作为我的数据存储。
我在崩溃日志中看到很多与此代码相关的崩溃,尽管我目前无法自己重现它们:
/// Resize cells when orientation changes.
override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
if visible {
dispatch_async(dispatch_get_main_queue()) {
if let coordinator = coordinator as UIViewControllerTransitionCoordinator? {
if self.collectionView != nil {
self.collectionView.reloadData()
coordinator.animateAlongsideTransition({ context in
self.collectionView.performBatchUpdates(nil, completion: nil)
}, completion: nil)
}
}
}
}
}
此代码出现在包含 UICollectionView
的视图控制器中,该视图控制器根据方向显示不同大小的单元格。我不清楚为什么我需要 self.collectionView.reloadData()
在动画之前,但没有它,边距比预期的要宽得多。
这是我得到的轨迹:
0 libobjc.A.dylib 0x0000000180f400b0 objc_retain + 16 (objc-object.h:341)
1 UIKit 0x00000001873a1570 -[_UIViewControllerTransitionCoordinator _animateAlongsideTransitionInView:systemCompletion:animation:completion:] + 112 (UIViewControllerTransitioning.m:865)
2 UIKit 0x0000000186b17f40 -[_UIViewControllerTransitionCoordinator animateAlongsideTransition:completion:] + 68 (UIViewControllerTransitioning.m:906)
3 MyApp 0x00000001000fc78c 0x1000c0000 + 247692
4 libdispatch.dylib 0x000000018130d4bc _dispatch_call_block_and_release + 24 (init.c:760)
5 libdispatch.dylib 0x000000018130d47c _dispatch_client_callout + 16 (object.m:506)
6 libdispatch.dylib 0x0000000181312b84 _dispatch_main_queue_callback_4CF + 1844 (inline_internal.h:1063)
7 CoreFoundation 0x0000000181878d50 __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 12 (CFRunLoop.c:1613)
8 CoreFoundation 0x0000000181876bb8 __CFRunLoopRun + 1628 (CFRunLoop.c:2718)
9 CoreFoundation 0x00000001817a0c50 CFRunLoopRunSpecific + 384 (CFRunLoop.c:2814)
10 GraphicsServices 0x0000000183088088 GSEventRunModal + 180 (GSEvent.c:2245)
11 UIKit 0x0000000186a82088 UIApplicationMain + 204 (UIApplication.m:3772)
12 MyApp 0x00000001000c92d8 0x1000c0000 + 37592
13 libdyld.dylib 0x000000018133e8b8 start + 4 (start_glue.s:78)
我曾经能够通过更改另一个屏幕上的方向然后快速返回到 UICollectionView
的屏幕来触发类似的崩溃。 if visible
检查似乎解决了这个问题,我得到的这些崩溃少了很多,但仍然有一些。任何关于在我的代码中查找问题的位置或阅读这些跟踪的资源的任何想法都将不胜感激。
这里有几个小问题:
- 始终在 UIViewController 生命周期方法中调用
super
- GCD 调用可能会导致意外的不一致
请记住,dispatch_async
仅使用 GCD 安排您的代码块,并不保证它何时执行。该块完全有可能在动画开始后执行,从而使大小转换处于不一致状态。