Сначала сохраните AVPlayerItem в объекте NSPurgeableData и воспроизведите его; сохраните объект данных в объекте NSCache, чтобы автоматически удалить объект из памяти после того, как он воспроизвелся, или когда соединение разрывается, а прежний AVPlayerItem заменяется новым (все эти вещи вы должны делать в любом случае, независимо от конкретная проблема, которую вы описываете). Вот некоторый код, чтобы вы начали:
void (^cachePlayerItem)(AVPlayerItem *, NSCache *, NSString *) = ^(AVPlayerItem *playerItem, NSCache *cache, NSString *key) {
NSURL *fileURL = [(AVURLAsset *)playerItem.asset URL];
NSPurgeableData *data = [NSPurgeableData dataWithContentsOfURL:fileURL];
[data beginContentAccess];
[cache setObject:data forKey:key];
[data endContentAccess];
[data discardContentIfPossible];
};
Поместите этот блок в любом месте файла реализации, определив его в заголовочном файле с помощью:
typedef void (^cachePlayerItemBlock)(AVPlayerItem *, NSCache *, NSString *);
Вызовите его в методе с помощью:
cachePlayerItem(playerItem, playerItems, phAsset.localIdentifier);
Принимая во внимание, что playerItem — это AVPlayerItem, playerItems — это кеш NSCache, и, в зависимости от того, из какого актива вы получаете AVPlayerItem, какой-то уникальный для него идентификатор (или, в приведенном выше примере, связанный с ним актив).
Кстати, я соответственно настроил свои кеши в AppDelegate:
- (NSCache *)thumbnailCache {
__block NSCache *t = self->_thumbnailCache;
if (!t) {
t = [[NSCache alloc] init];
[t setName:@"Thumbnail Cache"];
[t setEvictsObjectsWithDiscardedContent:TRUE];
[t setCountLimit:self.assetsFetchResults.count];
self->_thumbnailCache = t;
}
return t;
}
Это обеспечивает не только глобальный доступ к кешу, но и один экземпляр кеша, что особенно важно при кэшировании AVPlayerItems, поскольку они могут быть большими по размеру.
Чтобы создать глобально доступный кеш в AppDelegate, добавьте их в файлы заголовков и реализации соответственно:
+ (AppDelegate *)sharedAppDelegate;
...а также:
+ (AppDelegate *)sharedAppDelegate
{
return (AppDelegate *)[[UIApplication sharedApplication] delegate];
}
Чтобы сослаться на кеш в других файлах классов, импортируйте заголовочный файл AppDelegate и, при желании, создайте ярлык для метода SharedApplication класса AppDelegate:
#import "AppDelegate.h"
#define AppDelegate ((AppDelegate *)[[UIApplication sharedApplication] delegate])
Кроме того, на кеш можно ссылаться с помощью...:
AppDelegate.thumbnailCache
...вместо:
AppDelegate.sharedAppDelegate.thumbnailCache
person
James Bush
schedule
22.10.2016