Асинхронная загрузка изображения в UIViewController - с кодом - PullRequest
0 голосов
/ 03 февраля 2012

Это написано в моем viewDidLoad методе

 NSOperationQueue *queue = [NSOperationQueue new];
    NSInvocationOperation *op = [[NSInvocationOperation alloc] 
                                        initWithTarget:self
                                        selector:@selector(downloadImage) 
                                        object:nil];
    [queue addOperation:op]; 

// Остальное в других методах;

- (void)downloadImage{
    NSData* imageData = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:person.picURL]];
    UIImage* image = [[UIImage alloc] initWithData:imageData] ;


    [self showImage: image];
}

Я попытался добавить следующие коды выше [self showImage: image];и я закончил с исключением.

1.) [self performSelectorOnMainThread:@selector(showImage:) withObject:image waitUntilDone:NO];

2.) [self performSelectorInBackground:@selector(showImage:) withObject:image];

// Это код showImage.

- (void)showImage:(UIImage *)img {

    if (img != nil) 
    {    
        myImageView = [[UIImageView alloc] initWithImage:img];

        myImageView.frame = CGRectMake(20, 20, 132, 124);

        [scrollView addSubview:myImageView];

        [pictureOfPerson setImage:img];        
    }
}

Я пытаюсь Asynchronously загрузить изображение и кэшировать его.Изображение загружается Asynchronously, но я не уверен, кэшируется ли оно.

1.) Как кэшировать изображение и использовать его при повторной загрузке представления

2.) Покаизображение загружается, что если я нажму на другой вид.Тогда мне нужно остановить загрузку.Как я могу написать этот код.Я знаю, что должен написать это в методе viewDidDissapear.

3.) Мой код правильный.Я что-то пропустил или есть лучший способ сделать это?если да, то учебник или пример кода, пожалуйста

Ответы [ 2 ]

1 голос
/ 03 февраля 2012

Я бы использовал GCD для загрузки изображения. Это гораздо проще в использовании, чем NSOperation. Вот пример:

UIImage *personPicture;
personPicture = [self.imageCache objectForKey:person.picURL];
if (!personPicture) {
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:person.picURL]];
        personPicture = [UIImage imageWithData:imageData];
        [self.imageCache setObject:imageData forKey:person.picURL];
        dispatch_async(dispatch_get_main_queue(), ^{
            [self showImage:personPicture];
        });
    });
}
else {
    [self showImage:personPicture];
}

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

-EDIT- Добавление кода для обработки кэширования.

1 голос
/ 03 февраля 2012

Вы можете использовать это: SDWebImage

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