首先将 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 头文件,如果需要,创建 AppDelegate 的 sharedApplication 方法的快捷方式:
#import "AppDelegate.h"
#define AppDelegate ((AppDelegate *)[[UIApplication sharedApplication] delegate])
Insodoing,缓存可以被...引用:
AppDelegate.thumbnailCache
...代替:
AppDelegate.sharedAppDelegate.thumbnailCache