2011-01-30 3 views
2

Мне нужно использовать поток, чтобы получить изображение из Интернета и назначить его в виде изображения.NSOperation и SetImage

Я подклассы NSOperation и назвал его с моей точки зрения контроллера, как:

NSOperation *operation = [[[GetImage alloc] init] autorelease]; 

[queue addOperation:operation]; 

я получить изображение тонкой, но как я могу идти о присвоении этого образа, который находится в моем классе NSOperation? У меня есть изображение, сохраненное в UIImage называется RetrievedImage:

NSData *imageData = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:url]]; 

retrievedImage = [[UIImage alloc] initWithData:imageData]; 

[imageData release]; 

Как я теперь получить, что в ImageView моего ViewController?

Благодаря

ответ

4

вы используете делегирование.

Ваш NSOperation:

- (void)main { 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
    NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://sstatic.net/stackoverflow/img/apple-touch-icon.png"]]; 
    UIImage *image = [UIImage imageWithData:data]; 
    [delegate fetchedImage:image]; 
    [pool drain]; 
} 

ваш делегат:

- (void)fetchedImage:(UIImage *)image { 
    if (![NSThread isMainThread]) { 
     [self performSelectorOnMainThread:_cmd withObject:image waitUntilDone:NO]; 
     return; 
    } 
    self.imageView.image = image; 
} 

важной частью является та часть, где вы проверяете, если вы работаете в основном потоке.
Вы не можете получить доступ к элементам интерфейса из другого потока. Так что, если вы не на главном потоке, вы начинаете тот же метод в основном потоке

+0

Мне нужно получить изображение при нажатии кнопки, а не загрузке в делегате при запуске. Можно ли использовать этот метод? – omniscian

+0

, конечно, –

+0

Хорошо, что сейчас отлично работает. Спасибо за вашу помощь.Только один последний вопрос, как мне теперь отменить эту операцию? У меня есть кнопка отмены, у которой есть [отмена операции] и [отмена очереди в очереди], но они, похоже, не работают. – omniscian

-2

ImageView имеет свойство изображения, попытайтесь получить доступ к этим.

+0

Я попытался установить ImageView setImage в обоих класс NSOperation и класс ViewController, и ни один из них не работает. Они не сбой, просто ничего не происходит. – omniscian

+0

Вы установили это перед добавлением изображения в представление? это должно работать ... – Icky

+0

Где я должен устанавливать изображение? В контроллере представления после вызова класса NSOperation или класса NSOperation после создания в нем экземпляра контроллера представления? – omniscian

0

У вас есть несколько вариантов здесь:

  1. Вы можете отчеканена ссылка на ваш ImageView к операции GetImage и назначаемые imageview.image, когда операция получает изображение.
  2. Вы можете подклассифицировать UIImageView и послушать уведомление, например GetImageFinishedNotification - операция отправляет это уведомление с прикрепленным изображением при его завершении, а изображение получает его и отображает изображение.
  3. Вы можете создать объект модели, обладающий свойством UIImage. Контроллер view сохраняет этот объект и настраивает наблюдение за ключевым значением в свойстве изображения. Операция также сохраняет на ней и устанавливает свойство изображения, когда оно получает изображение. Контроллер представления уведомляется об изменении и устанавливает правильное изображение.

Я лично предпочитаю NSNotification для такого рода вещей - на самом деле это очень похоже на проектот foursquare.

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