NSTimer 没有正确传递参数?
NSTimer not passing parameters correctly?
我有一个 UITableViewCell。它有 2 个 AVPlayer、2 个 AVPlayerItems 和 2 个 AVPlayerLayers。一个 AVPlayer 及其内容位于单元格的右侧,一个位于单元格的左侧。我正在使用 AVAssetResourceLoader 同时缓存和播放视频。这很好用,除了第二个视频不显示。它确实缓存正确,因为在滚动 tableview 之后,它可以从缓存中正常播放。但只是 AVPlayerLayer 没有显示视频内容。
AVAssetResourceLoader 无法同时处理 2 个下载。第一次加载 tableview 时,左侧的视频开始 download/play。在左侧视频的 downloading/playing 代码之后立即读取右侧视频的播放代码——当然,这意味着下载过程尚未完成。为了解决这个问题,我创建了一个计时器,如下所示:
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];
}
然后是选择器方法:
- (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];
}
}
}
基本上,这工作正常——AVAssetResourceLoader 获得正确的 URL、正确的 activityID 和 downloads/caches 正确的视频——除了视频在下载时不播放。我改变了背景颜色,我可以确认 AVPlayerLayer 确实存在于它应该存在的框架中。就是没有视频显示。
我试过切换左右视频和下载顺序——在这种情况下,右边的视频播放了,左边的视频没有播放。基本上,无论哪个视频必须使用此计时器并不断检查下载是否正在进行,视频是否无法正确显示,这让我觉得我在计时器方面做错了 scope/passing变量。
最后一个细节,希望对您有所帮助。如果我说以下内容(而不是我在这里使用的第一种方法):
if (self.downloadInProgress) {
[self playStreamingVideoOnRightInCell:videoCell withActivity:activity2];
}
然后,playerLayer 确实显示了视频——但这是错误的视频。它显示与单元格左侧相同的视频。
这一直是调试的噩梦,在这一点上我相当确定这与在此处使用计时器播放视频而不是在常规范围内播放视频有关。有人知道我可能做错了什么吗?
为了修复正确的视频播放,您需要更改以下内容。您正在使用 NSNumber
值而不是 BOOL
作为 left
值。
您的代码:
BOOL left = [[timer userInfo] objectForKey:@"left"];
应该是:
BOOL left = [[[timer userInfo] objectForKey:@"left"] boolValue];
我有一个 UITableViewCell。它有 2 个 AVPlayer、2 个 AVPlayerItems 和 2 个 AVPlayerLayers。一个 AVPlayer 及其内容位于单元格的右侧,一个位于单元格的左侧。我正在使用 AVAssetResourceLoader 同时缓存和播放视频。这很好用,除了第二个视频不显示。它确实缓存正确,因为在滚动 tableview 之后,它可以从缓存中正常播放。但只是 AVPlayerLayer 没有显示视频内容。
AVAssetResourceLoader 无法同时处理 2 个下载。第一次加载 tableview 时,左侧的视频开始 download/play。在左侧视频的 downloading/playing 代码之后立即读取右侧视频的播放代码——当然,这意味着下载过程尚未完成。为了解决这个问题,我创建了一个计时器,如下所示:
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];
}
然后是选择器方法:
- (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];
}
}
}
基本上,这工作正常——AVAssetResourceLoader 获得正确的 URL、正确的 activityID 和 downloads/caches 正确的视频——除了视频在下载时不播放。我改变了背景颜色,我可以确认 AVPlayerLayer 确实存在于它应该存在的框架中。就是没有视频显示。
我试过切换左右视频和下载顺序——在这种情况下,右边的视频播放了,左边的视频没有播放。基本上,无论哪个视频必须使用此计时器并不断检查下载是否正在进行,视频是否无法正确显示,这让我觉得我在计时器方面做错了 scope/passing变量。
最后一个细节,希望对您有所帮助。如果我说以下内容(而不是我在这里使用的第一种方法):
if (self.downloadInProgress) {
[self playStreamingVideoOnRightInCell:videoCell withActivity:activity2];
}
然后,playerLayer 确实显示了视频——但这是错误的视频。它显示与单元格左侧相同的视频。
这一直是调试的噩梦,在这一点上我相当确定这与在此处使用计时器播放视频而不是在常规范围内播放视频有关。有人知道我可能做错了什么吗?
为了修复正确的视频播放,您需要更改以下内容。您正在使用 NSNumber
值而不是 BOOL
作为 left
值。
您的代码:
BOOL left = [[timer userInfo] objectForKey:@"left"];
应该是:
BOOL left = [[[timer userInfo] objectForKey:@"left"] boolValue];