2014-02-20 81 views
1

我認爲我的問題是在我的代碼或邏輯。AFNetworking 2.0和下載多個圖像

我所試圖做的

我有一個view Controller 在集合視圖我有一個自定義UICollectionViewCell一個UICollectionView - 它的定製是由於需要下載並設置不同的圖像的原因每個單元格。這些圖像是具有其他屬性,如日期/標題項目等

這是我曾嘗試

創建一個自定義UITableViewCell和I類有這樣的代碼:

-(void) setDetailsWithTitle: (NSString *) title Image:(UIImage *) image Items: (NSArray *)items 
    { 
     int i = 0; 

     for (BBItem *item in items){ 

      BBThumbnailView *thumbNailView = [[BBThumbnailView alloc]initWithFrame:CGRectMake(5 + (60 * 1), 5, 60, 60)]; 
      [self.contentView addSubview:thumbNailView]; 
      thumbNailView.item = item; 
      thumbNailView.clipsToBounds = YES; 

      i++; 
     } 
    } 

在這裏,我給單元格的所有項目的數組。這些項目是對象。我下載了它們並用XML解析器解析了它們。這完美地工作,並在檢查每個對象時 - 他們都有我需要的正確屬性。

我在此方法中尚未使用UIImage參數。 for循環遍歷數組中的每個項目並設置圖像,thumbNailView.item是我設置的對象。

然後在BBThumbnailView我已經這樣做了:

設置每個項目,並獲得其URL

(id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 


     self.shouldShowPlaceHolder = NO; 
     self.backgroundColor = [UIColor clearColor]; 

     UIImageView *backGroundImageView = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"Thumbnail_Background_Big.png"]]; 


     [self addSubview:backGroundImageView]; 

     self.layer.masksToBounds = NO; 

     self.imageView = [[UIImageView alloc]initWithFrame:CGRectMake(4, 2, 60, 60)]; 

      // self.imageView.backgroundColor = [UIColor whiteColor]; 

     [self addSubview:self.imageView]; 
    } 
    return self; 
} 

self.imageView is the imageView I am setting for the cells. The other imageViews are placeholder images. 

-(void)setItem:(BBItem *)aItem 
{ 

    _item = aItem; 
    if (self.item){ 

     if (self.item.thumbnailUrl && [self.item.thumbnailUrl length] > 0){ 

      [self loadUrl: [NSURL URLWithString:self.item.thumbnailUrl]]; 
     } 
    } 

} 

這是我重寫的屬性BBItem的制定者。每個項目僅啓動URL的下載。

loadUrl方法:

-(void)loadUrl:(NSURL *)url 
{ 
    NSURLRequest *urlRequest = [[NSURLRequest alloc]initWithURL:url]; 
    AFHTTPRequestOperation *requestOperation = [[AFHTTPRequestOperation alloc] initWithRequest:urlRequest]; 
    requestOperation.responseSerializer = [AFImageResponseSerializer serializer]; 
    [requestOperation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { 
      //NSLog(@"Response: %@", responseObject); 
      //self.imageView.image = responseObject; 
     UIImage *image = [[UIImage alloc] init]; 
     image = responseObject; 
     [self.imageView setImage:image]; 



    } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
     NSLog(@"Image error: %@", error); 
    }]; 
    [requestOperation start]; 

} 

現在我已經把一個破發點上lodUrl方法,它與每個項目不同的網址,多次執行(由於許多BBItems有)。

問題

BBCollectionViewCell每個的圖像被設置爲相同的圖像。當我重新加載視圖或關閉應用並再次打開時,這總是一個不同的圖像,它將是一個不同的圖像。我把它當作下載和設置的最後一張圖片。

爲什麼我認爲它的發生

我想原因是由於由我取消先前請求的每個新的請求?任何人都可以解釋一下這個問題嗎?

+0

在做了一些更多的調試之後,我認爲這個問題與設置imageView有關。每次請求結束時,它都會將self.imageView的相同實例設置爲新圖像。 – Tander

+0

這似乎是重用問題 – rounak

+0

Esenitally,是的。我正在重複使用同一個單元格的實例。我沒有在cellForRowAtIndex方法中設置indexPath.row – Tander

回答

2

如果要創建隊列AFHTTPRequestOperation,可以使用:NSOperationQueue *queue。但我不認爲這是問題。 我認爲你應該做的(我改變功能):

-(void) setDetailsWithTitle: (NSString *) title Image:(UIImage *) image Item: (BBItem *)item 
{ 
    BBThumbnailView *thumbNailView = [[BBThumbnailView alloc]initWithFrame:CGRectMake(5 + (60 * 1), 5, 60, 60)]; 
    [self.contentView addSubview:thumbNailView]; 
    thumbNailView.item = item; 
    thumbNailView.clipsToBounds = YES; 
} 

你應該稱呼它爲每個cell

希望這將有助於。

+0

感謝Nicolas - 在cellForIndexPath中調用每個單元格的函數 - 我將數組傳遞給XML存儲器。我會研究NSOperationQueu – Tander

+0

,但是如果您爲每個單元格傳遞數組,那麼如果每個單元格都具有相同的圖像(最後一個...),那很正常。你必須區分函數中的每個單元格。 –

+0

函數中的for循環是不是設置每個單元格不同? – Tander

0

我會說你沒有將操作放在操作隊列中。因此,當您調用開始的操作時,它立即在後臺線程上執行,一次只能執行一次單一操作。

2個問題。爲什麼不使用UIImageView + AFNetworking?

爲什麼不提交圖像請求作爲批處理?或者至少在NSOperationQueue上運行它們

+0

我修改了代碼以使用UIImageView + AFNetworking - 這是這樣的一行:[self.imageView setImageWithURL:url]; - 我得到相同的結果。所有圖像在我的單元格中都是相同的。對於問題2:我沒有在操作方式上下得很多問題和想法AFNetworking處理這個問題? – Tander