Ich habe eine UITableViewCell. Es hat 2 AVPlayer, 2 AVPlayerItems und 2 AVPlayerLayers. Ein AVPlayer und sein Inhalt befinden sich auf der rechten Seite der Zelle und einer auf der linken Seite der Zelle. Ich verwende den AVAssetResourceLoader, um Videos gleichzeitig zu cachen und abzuspielen. Das funktioniert großartig, außer das zweite Video wird nicht angezeigt. Es wird korrekt zwischengespeichert, da es nach dem Scrollen der Tabellenansicht korrekt aus dem Cache abgespielt wird. Aber nur der AVPlayerLayer zeigt den Videoinhalt nicht so an, wie er sollte.NSTimer Parameter nicht korrekt übergeben?
Der AVAssetResourceLoader kann 2 gleichzeitige Downloads nicht verarbeiten. Beim ersten Laden der Tabellenansicht beginnt das Video auf der linken Seite zu spielen. Der Code zum Abspielen des Videos auf der rechten Seite wird unmittelbar nach dem Code zum Herunterladen/Abspielen des Videos auf der linken Seite gelesen - was bedeutet, dass der Download-Prozess noch nicht beendet ist. Um dieses Problem zu beheben, habe ich einen Timer erstellt, etwa so:
if (self.downloadInProgress) {
// download is in progress. wait to start next download
self.downloadQueueCount++;
NSDictionary *videoSettings = @{@"id": activity2.objectId,
@"activity": activity2, @"cell": videoCell, @"left": @NO}
self.timer = [NSTimer scheduledTimerWithTimeInterval:0.2
target:self selector:@selector(DownloadNextVideo:)
userInfo:videoSettings repeats:YES];
} else {
[self playStreamingVideoOnRightInCell:videoCell withActivity:activity2];
}
Und dann die Auswahlmethode:
- (void)DownloadNextVideo:(NSTimer *)timer {
if (self.downloadInProgress == NO) {
NSString *activityId = [[timer userInfo] objectForKey:@"id"];
self.videoChallengeID1 = activityId;
CompletedTableViewCell *videoCell = (CompletedTableViewCell *)[[timer userInfo]objectForKey:@"cell"];
Activity *activity = [[timer userInfo] objectForKey:@"activity"];
BOOL left = [[timer userInfo] objectForKey:@"left"];
[self.timer invalidate];
if (left) {
[self playStreamingVideoOnLeftInCell:videoCell withActivity:activity];
} else {
[self playStreamingVideoOnRightInCell:videoCell withActivity:activity];
}
}
}
Grundsätzlich funktioniert das richtig - die AVAssetResourceLoader die richtige URL erhält, korrekt activityID und lädt/speichert das richtige Video - außer, dass das Video beim Herunterladen nicht abgespielt wird. Ich habe die Hintergrundfarben geändert und kann bestätigen, dass der AVPlayerLayer tatsächlich in dem Frame vorhanden ist, in dem er sein sollte. Es wird einfach kein Video angezeigt.
Ich habe versucht, links und rechts Videos und Download-Reihenfolge - und in diesem Fall das richtige Video gespielt, und das linke Video nicht wiedergegeben. Grundsätzlich muss das Video, das diesen Timer verwendet und kontinuierlich prüft, ob ein Download läuft oder nicht, das Video nicht korrekt anzeigen, und das lässt mich glauben, dass ich etwas falsch mit dem Timer mache, was den Umfang/die Weitergabe von Variablen betrifft .
Ein letztes Detail, falls es helfen könnte. Wenn ich die folgende (anstelle der ersten Methode, die ich hier hatte) sagen:
if (self.downloadInProgress) {
[self playStreamingVideoOnRightInCell:videoCell withActivity:activity2];
}
Dann funktioniert die playerLayer Video zeigen - aber es ist das falsche Video. Es zeigt das gleiche Video wie auf der linken Seite der Zelle.
Das war ein Albtraum zu debuggen, und ich bin ziemlich sicher an diesem Punkt, dass es etwas damit zu tun hat, einen Timer hier zu verwenden, um das Video zu spielen, anstatt es innerhalb des regulären Bereichs zu tun. Hat jemand irgendwelche Ideen, was ich falsch machen könnte?