2011-01-30 72 views
2

我需要使用一個線程才能從Web中檢索圖像並將其分配到圖像視圖中。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]; 

我現在該如何獲取到我的ViewController的ImageView的?

謝謝

回答

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; 
} 

的重要組成部分,是你檢查,如果你是在主線程上運行的一部分。
您無法從另一個線程訪問界面元素。所以,如果你是不是在主線程,你開始在主線程同樣的方法

-2

ImageView有一個圖像屬性,請嘗試訪問它。

+0

我試圖設置的ImageView setImage兩個NSOperation類和ViewController類中,都沒有工作。他們不會崩潰,只是沒有任何反應。 – omniscian 2011-01-30 20:12:15

+0

在將imageview添加到視圖之前,您是否設置了此項?這應該是工作.... – Icky 2011-01-30 20:16:52

0

你這裏有幾個選項:

  1. 你可以交給你的ImageView到的getImage操作的參考,並指定當操作獲取圖像imageview.image。
  2. 您可以繼承UIImageView並讓它聽取通知,例如GetImageFinishedNotification - 操作在完成時附加圖像併發布此通知,並且imageview接收它並顯示圖像。
  3. 您可以設置具有UIImage屬性的模型對象。您的視圖控制器保留在此對象上,並在其圖像屬性上設置Key-Value觀察值。該操作也保留在其上並在獲取圖像時設置圖像屬性。 ViewController會收到更改提示並設置正確的圖像視圖。

我個人更喜歡NSNotification這種東西 - 它實際上非常類似於foursquare的fully-loaded項目。