It seems that the api replaceCurrentItemWithPlayerItem: will stuck the main thread for some seconds, I understand that replacing the item need the information of the new item which might take some time to preload. But questions come up that why replaceCurrentItemWithPlayerItem: with a nil item object would also stuck the main thread?? It happens to me that sometimes it take more than 5 seconds to replace a nil playerItem. I wonder what can I do to avoid the issue. Thanks for any advices!
I came across a similar blocking UI thread issue when I used UICollectionView
to display and preview video in local photo library via ALAssetLibrary
.
The scroll on switching videos is not smoothly,so I guess some method block UI thread.Then I use Core Animation
of Instruments
to analyze what exactly occupy the UI thread.In Time Profiler
I found out that replaceCurrentItemWithPlayerItem
need about 30ms to execute in main thread,which is more than 16ms (1000/60(fps)) result in choppy scrolling.
To solve the problem,first I tried that put replaceCurrentItemWithPlayerItem
in to background thread using GCD,but It not work.I'm not sure if it is because the Cocoa itself need update UI when call replaceCurrentItemWithPlayerItem
,which means the UI thread is still block.Finally I made it work by putting replaceCurrentItemWithPlayerItem
at the scrolling end (the delegate func scrollViewDidEndDecelerating(scrollView: UIScrollView)
).Now the scrolling is smoothly,yep!
Therefore,my advice is obvious : Using Instruments to analyse what exactly occupy the UI thread
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