滚动时Xcode表视图滞后

时间:2014-07-10 14:07:34

标签: ios objective-c xcode

(void)bilgileriYukle
{
    NSMutableArray *yemekIsimleri = [[NSMutableArray alloc] init];
    NSMutableArray *resimIsimleri = [[NSMutableArray alloc] init];


    NSURL *myURL = [[NSURL alloc]initWithString:@"http://www.sevgilezzeti.com/WebServices/tarifler.php"];
    NSData *myData = [[NSData alloc]initWithContentsOfURL:myURL];
    if (myData == nil)
    {
        NSLog(@"INTERNET YOK YADA VERI CEKEMEDI");
    }
    else
    {
        NSLog(@"INTERNET VAR VERI CEKILDI");
        NSArray *jsonArray = [NSJSONSerialization JSONObjectWithData:myData options:kNilOptions error:nil];
        for (id element in jsonArray)
        {
            NSString *durum = [element objectForKey:@"durum"];
            if([durum isEqualToString:@"1"])
            {
                [yemekIsimleri addObject:[element objectForKey:@"yemekadi"]];
                NSString *gelenYemekAdi =[element objectForKey:@"kapakresmi"];
                NSString *imagePathKapak = @"http://sevgilezzeti.com/Admin/yemekresimkapak/";
                combined = [NSString stringWithFormat:@"%@%@", imagePathKapak, gelenYemekAdi];
                [resimIsimleri addObject:combined];

            }

        }

    }

    _TarifAdi=yemekIsimleri;
    _ResimAdi=resimIsimleri;

}

/////////////////////////////////////////////// ////////////////////////////////////////

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{

    TableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"TableViewCell" forIndexPath:indexPath];

       NSUInteger row = [indexPath row];

    cell.TitleLabel.text = _TarifAdi[row];


    NSCache *_imageCache;
    UIImage *image = [_imageCache objectForKey:@"DenemeRes"];
    if (image == nil) {
        NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:_ResimAdi[row]]];
        image = [UIImage imageWithData:data];
        [_imageCache setObject:image forKey:@"DenemeRes"];
    }


    cell.ThumbImage.image = image;

    return cell;

}

我可以从URL获取图像并且可以看到图像,但是当我滚动表格视图时,它非常缓慢且滞后。我该如何解决这个问题?

3 个答案:

答案 0 :(得分:3)

在表格视图单元格中同步加载图像非常容易和直接,但它是邪恶的,因为它会在滚动时导致延迟,因为它实际上是在尝试加载并在您滚动时显示图像。

因此,您必须避免同步加载图像,而是使用主线程以外的其他线程异步加载图像,以便可以依赖地完成滚动和加载+显示图像,避免任何类型的延迟。

这可能是一个重复的问题,因为它已经被问过并且有教程,但是因为我自己总是在我的第一个iOS应用程序上遇到这个问题并且发现它非常令人困惑,我&#39 ;我在这里发布答案,希望它有用。

尝试将这样的内容添加到- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

// Get the filename to load.
NSString *imageFilename = [imageArray objectAtIndex:[indexPath row]];
NSString *imagePath = [imageFolder stringByAppendingPathComponent:imageFilename];

[[cell textLabel] setText:imageFilename];

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);

dispatch_async(queue, ^{
    UIImage *image = [UIImage imageWithContentsOfFile:imagePath];

    dispatch_sync(dispatch_get_main_queue(), ^{
        [[cell imageView] setImage:image];
        [cell setNeedsLayout];
    });
});

答案 1 :(得分:2)

dataWithContentsOfURL阻塞了你的主线程,这就是为什么表的表现就像它一样。您应该在后台线程中加载图像,以便主线程可以无中断地处理UI

NSURL *url = [NSURL URLWithString:link];
        NSURLRequest *urlRequest = [[NSURLRequest alloc] initWithURL:url cachePolicy:0 timeoutInterval:kTimeoutInterval];
[NSURLConnection sendAsynchronousRequest:urlRequest 
                                       queue:[NSOperationQueue mainQueue]
                           completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
    UIImage *image = [[UIImage alloc] initWithData:self.activeDownload];
    // set to ImageView
    cell.ThumbImage.image = image;

    }];

答案 2 :(得分:1)

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{

    TableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"TableViewCell" forIndexPath:indexPath];

    cell.tag = indexPath.row;
    cell.imageView.image = nil;

    // Rounded Rect for cell image
    CALayer *cellImageLayer = cell.imageView.layer;
    [cellImageLayer setCornerRadius:35];
    [cellImageLayer setMasksToBounds:YES];


    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
    dispatch_async(queue, ^(void) {


        NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:_ResimAdi[indexPath.row]]];
        UIImage *image = [[UIImage alloc] initWithData:data];

        if (image) {

            dispatch_async(dispatch_get_main_queue(), ^{
                if (cell.tag == indexPath.row) {

                    CGSize itemSize = CGSizeMake(70, 70);
                    UIGraphicsBeginImageContext(itemSize);
                    CGRect imageRect = CGRectMake(0.0, 0.0, itemSize.width, itemSize.height);
                    [image drawInRect:imageRect];
                    cell.imageView.image = UIGraphicsGetImageFromCurrentImageContext();
                    UIGraphicsEndImageContext();
                    [cell setNeedsLayout];

                }
            });
        }
    });

    cell.TitleLabel.text = _TarifAdi[indexPath.row];
    return cell;

}