iOS table view lag issue, i'm using dispatch and save cache

    - (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:25];
        [cellImageLayer setMasksToBounds:YES];



        [self getImages];
        [self storeImages];
        UIImage *image =_ResimSonHali[indexPath.row];
        dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);

        dispatch_async(queue, ^(void) {



            if (image) {

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

                        CGSize itemSize = CGSizeMake(50, 50);
                        UIGraphicsBeginImageContext(itemSize);
                        CGRect imageRect = CGRectMake(0.0, 0.0, itemSize.width, itemSize.height);
                        [image drawInRect:imageRect];


                       // cell.ThumbImage.image = image1;
                        cell.imageView.image = UIGraphicsGetImageFromCurrentImageContext();

                        UIGraphicsEndImageContext();
                        [cell setNeedsLayout];

                    }
                });
            }
        });

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

    }

-(void)getImages
{

    NSMutableArray *fuckingArrayYemek = [[NSMutableArray alloc] init];

    for (int i=0; i<[_ResimAdiBase count]; i++)
    {
        NSString *testString=_ResimAdiBase[i];
        NSArray *ImageNames = [testString componentsSeparatedByString:@"."];
        [self cacheImage: _ResimAdi[i] : ImageNames[0] ];
        [fuckingArrayYemek addObject:ImageNames[0]];


    }

    _ResimSonAdi = fuckingArrayYemek;

}

-(void) storeImages
{
     NSMutableArray *fuckingArrayYemekName = [[NSMutableArray alloc] init];
    for (int i=0; i<[_ResimAdiBase count]; i++)
    {
        [fuckingArrayYemekName addObject:[self getCachedImage:_ResimSonAdi[i]]];

    }
    _ResimSonHali = fuckingArrayYemekName;


}
- (void) cacheImage: (NSString *) ImageURLString : (NSString *)imageName
{
    NSURL *ImageURL = [NSURL URLWithString: ImageURLString];

    // Generate a unique path to a resource representing the image you want

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *docDir = [paths objectAtIndex: 0];
    NSString *docFile = [docDir stringByAppendingPathComponent: imageName];

    // Check for file existence
    if(![[NSFileManager defaultManager] fileExistsAtPath: docFile])
    {
        // The file doesn't exist, we should get a copy of it

        // Fetch image
        NSData *data = [[NSData alloc] initWithContentsOfURL: ImageURL];

        UIImage *image = [[UIImage alloc] initWithData: data];

        // Is it PNG or JPG/JPEG?
        // Running the image representation function writes the data from the image to a file
        if([ImageURLString rangeOfString: @".png" options: NSCaseInsensitiveSearch].location != NSNotFound)
        {

            [UIImagePNGRepresentation(image) writeToFile: docFile atomically: YES];

        }
        else if([ImageURLString rangeOfString: @".jpg" options: NSCaseInsensitiveSearch].location != NSNotFound ||
                [ImageURLString rangeOfString: @".jpeg" options: NSCaseInsensitiveSearch].location != NSNotFound)
        {
            [UIImageJPEGRepresentation(image, 100) writeToFile: docFile atomically: YES];
        }
    }
}


- (UIImage *) getCachedImage : (NSString *)imageName
{

    NSArray *paths = NSSearchPathForDirectoriesInDomains
    (NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString* cachedPath = [documentsDirectory stringByAppendingPathComponent:imageName];

    UIImage *image;

    // Check for a cached version
    if([[NSFileManager defaultManager] fileExistsAtPath: cachedPath])
    {
        image = [UIImage imageWithContentsOfFile: cachedPath]; // this is the cached image
    }
    else
    {
        NSLog(@"Error getting image %@", imageName);
    }

    return image;
}

When i load 20 data, our table do not lagging but when our try to increase data size table view getting lag how we can prove this problem. First we tried dispatch then we tried save images cache still we got lag. Approximately, we deal with this problem about 3 days.

Upvotes: 4

Views: 492

Answers (1)

Yogendra
Yogendra

Reputation: 1716

This is the problem line inside cacheImage() method, which is called with every call of "cellForRowAtIndexPath" method

NSData *data = [[NSData alloc] initWithContentsOfURL: ImageURL];

So to resolve the problem use this line under dispatch_async section. And update your code according to it.

Upvotes: 1

Related Questions