Как решить проблему медленной прокрутки в UITableView - с помощью API YouTube - PullRequest
1 голос
/ 18 апреля 2011

Я работаю с Google YouTube API и использую этот код, найденный здесь http://pastebin.com/vmV2c0HT

Код, который замедляет вещи, вот этот cell.imageView.image = [UIImage imageWithData:data];

Когда я удаляю этот код, он плавно прокручивается. Любая идея о том, как я могу заставить его загружать изображения из Google, но по-прежнему плавно прокручивать? Я прочитал некоторые ответы о загрузке изображений другим способом, но я до сих пор не могу понять, как мне будет работать с кодом, который я использую.

Любая помощь будет оценена.

Ниже приведен полный код.

   #import "RootViewController.h"

@interface RootViewController (PrivateMethods)
- (GDataServiceGoogleYouTube *)youTubeService;
@end


@implementation RootViewController

@synthesize feed;

- (void)viewDidLoad {
    NSLog(@"loading");

    GDataServiceGoogleYouTube *service = [self youTubeService];

    NSString *uploadsID = kGDataYouTubeUserFeedIDUploads;
    NSURL *feedURL = [GDataServiceGoogleYouTube youTubeURLForUserID:@"BmcCarmen"
                                                         userFeedID:uploadsID];



    [service fetchFeedWithURL:feedURL
                     delegate:self
            didFinishSelector:@selector(request:finishedWithFeed:error:)];

    [super viewDidLoad];    
}

- (void)request:(GDataServiceTicket *)ticket
finishedWithFeed:(GDataFeedBase *)aFeed
          error:(NSError *)error {

    self.feed = (GDataFeedYouTubeVideo *)aFeed;

    [self.tableView reloadData];


}


#pragma mark Table view methods

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}






// Customize the number of rows in the table view.
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return [[feed entries] count];
}


// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }

    // Configure the cell.
    GDataEntryBase *entry = [[feed entries] objectAtIndex:indexPath.row];
    NSString *title = [[entry title] stringValue];
    NSArray *thumbnails = [[(GDataEntryYouTubeVideo *)entry mediaGroup] mediaThumbnails];

    cell.textLabel.text = title;

    NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:[[thumbnails objectAtIndex:0] URLString]]];
    cell.imageView.image = [UIImage imageWithData:data];

    return cell;
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return 100.0f;
}




- (void)dealloc {

    [super dealloc];
}


- (GDataServiceGoogleYouTube *)youTubeService {
    static GDataServiceGoogleYouTube* _service = nil;

    if (!_service) {
        _service = [[GDataServiceGoogleYouTube alloc] init];


        [_service setShouldCacheDatedData:YES];
        [_service setServiceShouldFollowNextLinks:YES];
    }

    // fetch unauthenticated
    [_service setUserCredentialsWithUsername:nil
                                    password:nil];

    return _service;
}

@end

1 Ответ

3 голосов
/ 18 апреля 2012

GCD - замечательная вещь. Вот что я делаю:



    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        static NSString *CellIdentifier = @"youTubeCell";
        UITableViewCell *cell = nil;

        cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
        if (cell == nil) 
        {
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
        }

        // Configure the cell.
        GDataEntryBase *entry = [[feed entries] objectAtIndex:indexPath.row];
        NSString *title = [[entry title] stringValue];
        NSArray *thumbnails = [[(GDataEntryYouTubeVideo *)entry mediaGroup] mediaThumbnails];

        cell.textLabel.text = title;
        // Load the image with an GCD block executed in another thread
        dispatch_queue_t downloadQueue = dispatch_queue_create("image downloader", NULL);
        dispatch_async(downloadQueue, ^{
            NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:[[thumbnails objectAtIndex:0] URLString]]];
            UIImage * image = [UIImage imageWithData:data];

            dispatch_async(dispatch_get_main_queue(), ^{            
                cell.imageView.image = image;
                cell.imageView.contentMode = UIViewContentModeScaleAspectFit;
                [cell setNeedsLayout];
            });
        });
        dispatch_release(downloadQueue);

        return cell;
    }

Прокрутка теперь супер плавная. Единственным недостатком является то, что при быстрой прокрутке ячейки используются повторно, и иногда изображения меняются по мере поступления новых.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...