NSOperation и SetImage - PullRequest
       8

NSOperation и SetImage

2 голосов
/ 30 января 2011

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

Я подкласс 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 ]

4 голосов
/ 30 января 2011

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

Ваша 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 голосов
/ 31 января 2011

Попробуйте использовать HJCache, он сделан для такого рода вещей: http://www.markj.net/hjcache-iphone-image-cache/

0 голосов
/ 30 января 2011

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

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

Я лично предпочитаю NSNotification для такого рода вещей - на самом деле он очень похож на полностью загруженный проект Foursquare *1012*.

0 голосов
/ 30 января 2011

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

...