我正在使用 YouTube API 非常简单地获取一些视频并将它们显示在我的 iPhone 应用程序的 UITableView 中,但是它会导致我的表格在获取视频时暂时冻结。
我可以调用下面的代码来获取接下来的 25 个视频,它工作得很好,但是在获取过程中的某个时刻,我的 UITableView 冻结,然后在几秒钟后,一旦获取完成,它就会再次启动。您对我如何阻止这种情况有任何想法吗?
NSURL *url = [[[feeds lastObject] nextLink] URL];
GDataQueryYouTube* query = [GDataQueryYouTube youTubeQueryWithFeedURL:url];
ticket = [service fetchFeedWithQuery:query delegate:self didFinishSelector:@selector(requestAdditional:finishedWithFeed:error:)];
- (void)requestAdditional:(GDataServiceTicket *)ticket finishedWithFeed:(GDataFeedBase *)aFeed error:(NSError *)error
{
[feeds addObject:aFeed];
NSArray *newEntries = [aFeed entries];
for (GDataEntryBase *entry in newEntries)
{
[entry setParent:nil];
[feed addEntry:entry];
}
[self fetchVideoData];
[self dismissViewControllerAnimated:YES completion:^{}];
[self.tableView reloadData];
}
编辑
我认为导致速度变慢的原因是我打电话时[self fetchVideoData];
。在这个方法中,我调用了一堆其他方法来获取所有不同的数据位、视频标题、观看次数、缩略图等。
我尝试将此方法的大部分内容放在 GCD 方法的第一部分,然后在后半部分将我的图像对象添加到我的数组中,但我的数组只是空的。
这是一个特别缓慢的方法的示例,获取缩略图。我已经看到并尝试过但未能将 GCD 方法应用于此。
-(void)setThumbnailsArray
{
for (int i = 0; i < [[feed entries] count]; i++)
{
GDataEntryBase *entry = [[feed entries] objectAtIndex:i];
NSArray *thumbnails = [[(GDataEntryYouTubeVideo *)entry mediaGroup] mediaThumbnails];
NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:[[thumbnails objectAtIndex:1] URLString]]];
UIImage *image = [UIImage imageWithData:data];
//No thumbnail, create placeholder using avatar
if (image == nil)
{
UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 110, 64)];
[view setBackgroundColor:[UIColor whiteColor]];
UIImageView *avatar = [[UIImageView alloc] initWithImage:[UIImage imageNamed:[NSString stringWithFormat:@"%@Avatar.png", memberName]]];
[avatar setFrame:CGRectMake(0, 0, avatar.frame.size.width - 10, avatar.frame.size.height - 10)];
avatar.center = view.center;
[view addSubview:avatar];
//Create UIImage from the view with the avatar
UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.opaque, 0.0);
[view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage * img = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
image = img;
}
[feedThumbnails addObject:image];
}
}