Загрузка изображений в ScrollView - PullRequest
0 голосов
/ 13 июня 2011

Привет, есть проблема с тем, что загрузка изображений (1024x1024), кэшированных на диске в UIScrollView, занимает некоторое время (просто отстает, но раздражает) для загрузки в память.при использовании изображений размером 668px × 445px допускается отставание.Я пытался загрузить данные, используя потоки тот же результат, когда я использую dispatch_async

Любой иде, как улучшить производительность при загрузке данных асинхронно?

-(void)setupImageView:(BMPhoto *)_photo {
    methodStart = [[NSDate date] retain];

    if ([[photo imageUrl] isEqualToString:[_photo imageUrl]])
        return;

     photo = _photo;

    [imageView removeFromSuperview];
    [imageView release];
    imageView = nil;

    self.zoomScale = 1.0;
    BMCache *cache = [BMCache sharedCache];


    if ([cache isFileCached:[photo imageUrl]]) {
        [NSThread detachNewThreadSelector:@selector(loadImageFromCache:) toTarget:self withObject:[photo imageUrl]];
    } else {
        [NSThread detachNewThreadSelector:@selector(loadImageFrom:) toTarget:self withObject:[photo imageUrl]];
    }
}
-(void)loadImageFromCache:(NSString *)url{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    UIImage *image = [UIImage imageWithData:[[BMCache sharedCache] getCachedRemoteFile:url]];
    [self performSelectorOnMainThread:@selector(displayImage:) withObject:image waitUntilDone:NO];
   [pool release];
}
-(void)loadImageFrom:(NSString *)url{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    NSData* imageData = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:[photo imageUrl]]];
    [[BMCache sharedCache] addRemoteFileToCache:url withData:imageData];

    UIImage* image = [[[UIImage alloc] initWithData:imageData] autorelease];
    [imageData release];
    [self performSelectorOnMainThread:@selector(displayImage:) withObject:image waitUntilDone:NO];
    [pool release];
}

- (void)displayImage:(UIImage *)image {
    NSDate *methodFinish1 = [NSDate date];
    NSTimeInterval executionTime1 = [methodFinish1 timeIntervalSinceDate:methodStart];
    NSLog(@"Thread Done time: %f", executionTime1);

    if (image) {
        //imageView.image = nil;
        imageView = [[BMPhotoViewImageView alloc] initWithImage:image];
        [self addSubview:imageView];

        self.contentSize = [image size];
        [self setMaxMinZoomScalesForCurrentBounds];
        self.zoomScale = self.minimumZoomScale;
        NSTimeInterval executionTime2 = [[NSDate date] timeIntervalSinceDate:methodFinish1];
        NSLog(@"Load image time time: %f", executionTime2);

        NSDate *methodFinish = [NSDate date];
        NSTimeInterval executionTime = [methodFinish timeIntervalSinceDate:methodStart];
        NSLog(@"Total time: %f", executionTime);
        NSLog(@"-------------------------------------------");
    }
}

Thread Done время: 0,015229 Время загрузки изображения время: 0,009824

Общее время: 0,028263

Время выполнения нити: 0,025037 Время загрузки изображения: 0,005314

Общее время: 0,035781

Время выполнения нити: 0,026063Время загрузки изображения: 0,004379

Общее время: 0,033177

1 Ответ

0 голосов
/ 13 июня 2011

Вы можете попробовать ... Сначала покажите imageView (метод displayImage), поместите несколько небольших состояний изображения «загрузка» или индикатор активности.затем загрузите (используйте поток) и установите фактическое изображение в imageView.

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