Scroll view and table view performance when loading images from disk

后端 未结 5 1668
说谎
说谎 2021-02-04 18:50

I\'m trying to improve the performance of my image-intensive iPhone app by using a disk-based image cache instead of going over the network. I\'ve modeled my image cache after S

5条回答
  •  眼角桃花
    2021-02-04 19:38

    If you've narrowed it down to network activity I would try encapsulating your request to ensure it is 100% off of the main thread. While you can use NSURLConnection asynchronously and respond to it's delegate methods, I find it easier to wrap a synchronous request in a background operation. You can use NSOperation or grand central dispatch if your needs are more complex. An (relatively) simple example in an imageLoader implementation could be:

    // imageLoader.m
    
    // assumes that that imageCache uses kvp to look for images
    - (UIImage *)imageForKey:(NSString *)key
    {
        // check if we already have the image in memory
         UImage *image = [_images objectForKey:key];
    
        // if we don't have an image:
        // 1) start a background task to load an image from a file or URL
        // 2) return a default image to display while loading
        if (!image) {
            [self performSelectorInBackground:@selector(loadImageForKey) withObject:key];
            image = [self defaultImage];
        }
    
        return image;
    }
    
    - (void)loadImageForKey:(NSString *)key
    {
        NSAutoReleasePool *pool = [[NSAutoReleasePool alloc] init];
    
        // attempt to load the image from the file cache
        UIImage *image = [self imageFromFileForKey:key];
    
        // if no image, load the image from the URL
        if (!image) {
            image = [self imageFromURLForKey:key];
        }
    
        // if no image, return default or imageNotFound image
        if (!image) {
            image = [self notFoundImage];
        }
    
        if ([_delegate respondsTo:@selector(imageLoader:didLoadImage:ForKey:)]) {
            [_delegate imageLoader:self didLoadImage:image forKey:key];
        }
    
        [pool release];
    }
    
    - (UIImage *)imageFromURLForKey:(NSString *)key
    {
        NSError *error = nil;
        NSData *imageData = [NSData dataWithContentsOfURL:[self imageURLForKey:key]
                                                  options:0
                                                    error:&error];
    
        UIImage *image;
    
        // handle error if necessary
        if (error) {
            image = [self errorImage];
        }
    
        // create image from data
        else {
            image = [UIImage imageWithData:imageData];
        }
    
        return image;
    }
    

提交回复
热议问题