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];
}
}