Es scheint, dass die api replaceCurrentItemWithPlayerItem: den Hauptthread für einige Sekunden stecken wird, verstehe ich, dass das Ersetzen des Elements die Informationen des neuen Elements benötigen, die einige Zeit zum Vorladen benötigen. Aber es kommen Fragen auf, warum replaceCurrentItemWithPlayerItem: mit einem nil item Objekt würde auch den Hauptfaden stecken ?? Es passiert mir, dass es manchmal mehr als 5 Sekunden dauert, um ein nil playerItem zu ersetzen. Ich frage mich, was ich tun kann, um das Problem zu vermeiden. Danke für irgendwelche Ratschläge!iOS AVPlayer replaceCurrentItemWithPlayerItem: Kein Block UI Thread
Antwort
Ich stieß auf ein ähnliches blockierendes UI-Thread-Problem, als ich UICollectionView
zum Anzeigen und Vorschau Video in lokalen Fotobibliothek über ALAssetLibrary
.
Die Schnecke auf Schalt Videos ist nicht glatt, so dass ich denke, einige UI-Methode Block thread.Then I Core Animation
von Instruments
verwenden, um zu analysieren, was genau die UI-Thread besetzen .In Time Profiler
Ich fand heraus, dass replaceCurrentItemWithPlayerItem
über müssen 30ms Ausführen im Hauptthread, was mehr als 16ms (1000/60 (fps)) ist, führt zu kabellosem Scrollen.
Um das Problem zu lösen, zuerst habe ich versucht, setzen replaceCurrentItemWithPlayerItem
in Hintergrund Thread mit GCD, aber es funktioniert nicht.Ich bin nicht sicher, ob es ist, weil der Cocoa selbst UI aktualisieren müssen, wenn Anruf replaceCurrentItemWithPlayerItem
, was die UI bedeutet Thread ist immer noch block.Finally habe ich es funktioniert, indem replaceCurrentItemWithPlayerItem
am Scroll-Ende (der Delegierte func scrollViewDidEndDecelerating(scrollView: UIScrollView)
). Nun ist das Scrollen reibungslos, yep!
Daher mein Rat ist offensichtlich: Instrumente zu analysieren, was genau dem UI-Thread
Dank Kumpel besetzen, Sie meinen Tag gerettet: D –