0

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

2 に答える 2

0

InstrumentsのTimeProfilerを使用してアプリケーションのプロファイリングを行い、フリーズ中に何が起こっているかを調べます。コードは、ブロックするようなことは何もしていないように見えます。

于 2012-12-20T13:47:28.853 に答える
0

メインスレッドでYouTubeに電話をかけていますか?その場合、これにより、その呼び出しの実行中にUIが応答しなくなります。

一般に、メインスレッドで時間のかかる操作を実行する必要はありません。Grand Central Dispatchを使用すると、次のようになります。

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    //Time consuming operations go here

    //When finished call back on the main thread:
    dispatch_async(dispatch_get_main_queue(), ^{
        //Return results and update data back on main thread 
    });
});
于 2012-12-20T13:54:16.210 に答える