Добавьте UIImage к NSMutableArray через метод делегата S3 - PullRequest
1 голос
/ 19 января 2012

Я пытаюсь заставить AWS S3 получать изображения из корзины S3, код ниже состоит из двух частей. Первый (я думаю) создает запрос на получение объекта после инициализации массива для помещения объекта (arrayImages, он получает счетчик из arrayPointer). Второй - это метод делегата, который помещает объект (данные) в arrayImages после его завершения. Я бы предположил, что каждый раз, когда вызывается метод делегата, он добавляет новый объект. Что-то здесь не так:

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

1 Ответ

0 голосов
/ 20 января 2012

вам нужно добавить данные, полученные в вашем ...

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

... методе, так как он может быть вызван многократно.объявите NSMutableData * responseData в вашем заголовочном файле и добавляйте данные до тех пор, пока не будет вызван ваш делегат didCompleteWithResponse.

[responseData appendData:data];

Убедитесь, что вы выделяете изменяемые данные перед вызовом AmazonS3Client.

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

Вероятно, вам потребуется реализовать все эти делегаты: (но документы Amazon должны быть в состоянии подтвердить)

  • didReceiveResponse: Отправляется, когда данные тела были прочитаны.Может вызываться несколько раз.
  • didReceiveData: Отправляется, когда считываются данные тела.Может вызываться несколько раз.
  • didCompleteWithResponse: Отправляется, когда весь ответ прочитан и обработан.Объект, отправленный этому методу, является тем же объектом, который возвращается при выполнении асинхронного запроса.
  • didSendData: Отправляется, когда запрос передает данные.
  • didFailWithError: Отправляется, когда произошла базовая ошибка сбазовое соединение.
  • didFailWithServiceException: отправляется, когда служба отвечает сообщением об ошибке.
...