2012-02-03 4 views
0

Это написано в моем viewDidLoad методеЗагрузка изображений в UIViewController Асинхронный - с кодом

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.) Является ли мой код правильным. Я что-то пропустил или есть лучший подход к этому? если это учебник или некоторые примеры кода, пожалуйста,

ответ

1

Я хотел бы использовать ГКД, чтобы загрузить изображение. Это намного проще в использовании, чем 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- Добавление кода для обработки кеширования.

+0

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

+0

Что такое' self.imageCache'? – shajem

+0

imageCache будет вашим NSMutableDictionary. –

Смежные вопросы