1

我試圖讓AWS S3從S3存儲桶中獲取圖像,下面的代碼分爲兩部分。第一個(我認爲)在啓動數組以將對象放入(arrayImages,它從arrayPointer中獲得計數)之後創建get對象請求。第二種是委託方法,一旦它完成,將對象(數據)放入arrayImages中。我會假設每次調用委託方法時都會添加一個新對象。什麼是錯在這裏:通過委託方法將UIImage添加到NSMutableArray S3

-(void)gets3ImageArray 
{ 

    if (arrayImages == nil) { 
     arrayImages = [[NSMutableArray alloc] initWithCapacity:[arrayPointer count]]; 
    } 
    else 
    { 
     [arrayImages removeAllObjects]; 
    } 

    AmazonS3Client *s3 = [[AmazonS3Client alloc] initWithAccessKey:ACCESS_KEY_ID withSecretKey:SECRET_KEY]; 

    for (NSString *name in arrayPointer){ 
      @try { 
     S3GetObjectRequest *gor = [[S3GetObjectRequest alloc]initWithKey:name withBucket:[Constants pictureBucket]]; 
     [gor setDelegate:self]; 
     [s3 getObject:gor]; 

    } 

    @catch (AmazonClientException *exception) { 
     [Constants showAlertMessage:exception.message withTitle:@"Download Error"]; 
    } 
    } 
} 

-(void)request:(AmazonServiceRequest *)request didReceiveData:(NSData *)data 
{ 
    UIImage *myImage = [[UIImage alloc] initWithData:data]; 
    if(!myImage) 
    { 
     NSLog(@"NO IMAGE"); 
     [arrayImages addObject:[UIImage imageNamed:@"placeholder.png"]]; 
    } 
    else 
    { 
    [arrayImages addObject:[UIImage imageWithData:data]]; 
} 
+0

如果您多次調用[self gets3ImageArray],它永遠不會超過您設置的初始容量。可能想檢查一下。委託方法實際上是否返回KindOfClass UIImage的數據?你已經有了myImage,所以只需添加它,而不是從imageWithData創建另一個圖像。首先檢查是否返回圖像。 –

+0

圖像被返回,當有多個圖像時,我會得到問題。我拿出initWithCapacity並仍然崩潰。崩潰往往發生在較大的圖像上。 – Eric

+0

我不熟悉亞馬遜的這些委託方法,還有更多嗎?很可能您只使用返回數據的第一遍,而不是整個流。因此較小的文件工作。 –

回答

0

你需要附加在您接收到的數據...

-(void)request:(AmazonServiceRequest *)request didReceiveData:(NSData *)data 

...方法,因爲它可以被稱爲multipled倍。在頭文件中聲明一個NSMutableData * responseData並追加數據,直到調用didCompleteWithResponse委託。

​​

確保在調用AmazonS3Client之前分配可變數據。

responseData = [[NSMutableData data] retain]; // or autorelease or not depending on ARC etc 

你可能需要實現所有這些代表:(但亞馬遜的文檔應該能夠確認)

  • didReceiveResponse:當身體數據已被閱讀。可能會被多次調用。
  • didReceiveData:讀取正文數據時發送。可能會被多次調用。
  • didCompleteWithResponse:當整個響應已被讀取和處理時發送。發送給此方法的對象與進行非異步請求時返回的對象相同。
  • didSendData:請求傳送數據時發送。
  • didFailWithError:當基礎連接發生基本故障時發送。
  • didFailWithServiceException:服務響應並顯示錯誤消息時發送。
+0

如何將每次didReceiveData調用分離出圖像? – Eric

+0

當didCompleteWithResponse被調用時,你的mutableData將會完成。然後檢查圖像和使用是否像以前一樣。 –

+0

它似乎將所有可變數據視爲加載的相同數據/最後一個數據。 – Eric