Sembra che api replaceCurrentItemWithPlayerItem: rimarrà il thread principale per alcuni secondi, ho capito che la sostituzione dell'elemento richiede le informazioni del nuovo elemento che potrebbero richiedere del tempo per il precaricamento. Ma le domande sono arrivate così perché replaceCurrentItemWithPlayerItem: con un oggetto nil si sarebbe bloccato anche il thread principale ?? A me capita che a volte ci vogliono più di 5 secondi per sostituire un player nullo. Mi chiedo che cosa posso fare per evitare il problema. Grazie per qualsiasi consiglio!iOS AVPlayer replaceCurrentItemWithPlayerItem: nil block UI Thread
risposta
Mi sono imbattuto in un problema simile di thread dell'interfaccia utente di blocco quando ho utilizzato UICollectionView
per visualizzare e visualizzare l'anteprima del video nella libreria di foto locali tramite ALAssetLibrary
.
Il rotolo sul video di commutazione non è senza problemi, quindi credo che un po 'di UI metodo blocco thread.Then io uso Core Animation
di Instruments
per analizzare che cosa esattamente occupare il thread UI .In Time Profiler
ho scoperto che replaceCurrentItemWithPlayerItem
bisogno di circa 30ms per esegui nel thread principale, che è più di 16ms (1000/60 (fps)) con uno scrolling continuo.
Per risolvere il problema, prima ho provato a inserire replaceCurrentItemWithPlayerItem
nella discussione in background utilizzando GCD, ma non funziona. Non sono sicuro se è perché il Cocoa stesso ha bisogno dell'interfaccia utente di aggiornamento quando si chiama replaceCurrentItemWithPlayerItem
, che significa l'interfaccia utente thread è ancora bloccato.Infine ho fatto funzionare mettendo replaceCurrentItemWithPlayerItem
alla fine a scorrimento (il delegato func scrollViewDidEndDecelerating(scrollView: UIScrollView)
). Ora lo scorrimento è uniformemente, sì!
Pertanto, il mio consiglio è evidente: l'utilizzo di strumenti per analizzare che cosa esattamente occupare il thread UI
Grazie amico, mi hai salvato la giornata: D –