NSOperation和SetImage

时间:2011-01-30 19:51:05

标签: iphone objective-c multithreading nsoperation

我需要使用一个线程来从网络中检索图像并将其分配到图像视图中。

我已经将NSOperation子类化,并从我的视图控制器调用它,如:

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

[queue addOperation:operation];

我的图像很好但是如何分配我的NSOperation类中的图像?我将图像存储在名为RetrievedImage的UIImage中:

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

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

[imageData release];

我现在如何将其导入ViewController的ImageView?

由于

4 个答案:

答案 0 :(得分: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;
}

重要的部分是检查您是否在主线程上运行的部分 您无法从另一个线程访问界面元素。因此,如果您不在主线程上,则在主线程上启动相同的方法

答案 1 :(得分:0)

你有几个选择:

  1. 您可以将对imageview的引用传递给GetImage操作,并在操作获取图像时分配给imageview.image。
  2. 您可以继承UIImageView并让它听取通知,比如说GetImageFinishedNotification-操作会在完成后附加图片发布此通知,并且imageview会收到它并显示图像。
  3. 您可以设置具有UIImage属性的模型对象。您的viewcontroller保留在此对象上,并在其image属性上设置Key-Value观察。该操作还会保留它并在获取图像时设置图像属性。视图控制器会收到更改警报并设置正确的图像视图。
  4. 我个人更喜欢NSNotification这类事情 - 它实际上与foursquare的fully-loaded项目非常相似。

答案 2 :(得分:0)

尝试使用HJCache,它是为这种东西制作的: http://www.markj.net/hjcache-iphone-image-cache/

答案 3 :(得分:-2)

ImageView有一个图像属性,请尝试访问它。