Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 通过委托方法S3将UIImage添加到NSMutableArray_Iphone_Iterator_Amazon S3_Nsmutablearray_Amazon Web Services - Fatal编程技术网

Iphone 通过委托方法S3将UIImage添加到NSMutableArray

Iphone 通过委托方法S3将UIImage添加到NSMutableArray,iphone,iterator,amazon-s3,nsmutablearray,amazon-web-services,Iphone,Iterator,Amazon S3,Nsmutablearray,Amazon Web Services,我试图让AWSS3从S3存储桶中获取图像,下面的代码分为两部分。第一个(我认为)在启动数组以将对象放入后创建get object请求(arrayImages,它从arrayPointer获取计数)。第二种是委托方法,它在对象(数据)完成后将其放入ArrayImage中。我假设每次调用委托方法时,它都会添加一个新对象。这里有点不对劲: -(void)gets3ImageArray { if (arrayImages == nil) { arrayImages = [[NS

我试图让AWSS3从S3存储桶中获取图像,下面的代码分为两部分。第一个(我认为)在启动数组以将对象放入后创建get object请求(arrayImages,它从arrayPointer获取计数)。第二种是委托方法,它在对象(数据)完成后将其放入ArrayImage中。我假设每次调用委托方法时,它都会添加一个新对象。这里有点不对劲:

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

您需要将收到的数据附加到

-(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文档应该能够确认)

  • DidReceiverResponse:读取主体数据时发送。可以多次调用
  • didReceiveData:读取正文数据时发送。可以多次调用
  • didCompleteWithResponse:在读取和处理整个响应时发送。发送到此方法的对象与发出非异步请求时返回的对象相同
  • didSendData:请求传输数据时发送
  • didFailWithError:在基础连接出现基本故障时发送
  • DidFailWithService异常:当服务响应错误消息时发送

如果多次调用[self gets3ImageArray],其容量永远不会超过您设置的初始容量。我想核实一下。委托方法实际返回的数据是否属于UIImage类?您已经有了myImage,所以只需添加它,而不是从imageWithData创建另一个图像。首先检查是否返回了一个图像。如果返回了一个图像,当有多个图像时,我会遇到问题。我拿出了一个有容量的系统,但仍然会崩溃。崩溃往往发生在较大的图像上。我不熟悉Amazon的这些委托方法,还有吗?很可能您只使用了第一次返回的数据,而不是整个流。因此较小的文件可以工作。如何添加流?我不熟悉。我如何分离didReceiveData的每个调用以分离图像?当调用didCompleteWithResponse时,您的可变数据将完成。然后检查映像和使用是否与以前一样。它似乎将所有可变数据视为相同的数据/上次加载的数据。请确保在代理首次执行后续操作时将其设置为nil;-)对不起,我不熟悉这个协议。不过看起来是这样的。