1

我正在创建一个 iOS 应用程序,它允许用户编写状态更新,人们可以对其发表评论,喜欢它,以多种方式与之交互,基本上状态更新具有多个将与它一起存储的属性。想象一个应用程序的主屏幕,其中超过 50 个状态更新表示为表格视图。

现在把你的眼睛移开,专注于一个练习/演示应用程序,一个试图在大型比赛之前掌握技术的开发人员(就是我!)所以基本上,我已经开始在新加坡建立一个 S3 存储桶。我住在新加坡,所以附近有一个服务器,真的一切都应该快速顺利。除了,它只是没有。它很慢,它开始让我生气。

我知道一个使用 S3 的应用程序可以加载带有评论、喜欢等的高清全景图像,并且加载所有这些数据需要一秒钟或更长时间。我不确定他们实际上是如何执行该过程的,我知道他们将图像存储在 S3 上,但我只知道这些。在我的入门演示中,我只需上传一些文本(比如 20 条)然后下载它们,在我的 60 mbps wifi 下大约需要 15 秒!这些文本甚至不超过一个句子,它们是短语,所以我在这里真的有点困惑。

我有 CloudFront 设置,但不是用于网站吗?我已经设置了管理分发和 URL,但是如何在我的代码中设置?这可能是我要确定稍后在我的其他应用程序中发布的最大问题。即便如此,我住在新加坡并且存储桶在新加坡服务器中,因此用于自测/练习的 CloudFront 不是强制性的。

我觉得这非常令人困惑,这是我生成的一些带注释的代码,是否有任何问题,导致它变慢的误解?

- (void)loadObjects {

S3ListObjectsRequest  *listObjectRequest = [[S3ListObjectsRequest alloc] initWithName: @"testbucketquotes.rohanprostudios"];
S3ListObjectsResponse *listObjectResponse = [[AmazonClientManager s3] listObjects:listObjectRequest];
if(listObjectResponse.error != nil)
{
}
else
{
    S3ListObjectsResult *listObjectsResults = listObjectResponse.listObjectsResult;

    if (objects == nil) {
        objects = [[NSMutableArray alloc] initWithCapacity:[listObjectsResults.objectSummaries count]];
    }
    else {
        [objects removeAllObjects];
    }

    // By defrault, listObjects will only return 1000 keys
    // This code will fetch all objects in bucket.
    NSString *lastKey = @"";
    for (S3ObjectSummary *objectSummary in listObjectsResults.objectSummaries) {

        if ([[objectSummary key] rangeOfString: @"UploadedQuote"].location != NSNotFound) {

        [objects addObject:[objectSummary key]];
        lastKey = [objectSummary key];

        }
    }

    while (listObjectsResults.isTruncated) {
        listObjectRequest = [[S3ListObjectsRequest alloc] initWithName: @"testbucketquotes.rohanprostudios"];
        listObjectRequest.marker = lastKey;

        listObjectResponse = [[AmazonClientManager s3] listObjects:listObjectRequest];
        if(listObjectResponse.error != nil)
        {                
            break;
        }

        listObjectsResults = listObjectResponse.listObjectsResult;

        for (S3ObjectSummary *objectSummary in listObjectsResults.objectSummaries) {

            if ([[objectSummary key] rangeOfString: @"UploadedQuote"].location != NSNotFound) {

                [objects addObject:[objectSummary key]];

            }

            lastKey = [objectSummary key];
        }
    }

    if (objects.count) {

        for (int i = 0; i <= objects.count - 1; i++) {

            S3GetObjectRequest *req = [[S3GetObjectRequest alloc] initWithKey:[objects objectAtIndex: i] withBucket: @"testbucketquotes.rohanprostudios"];

            `// asynchronously loads text (adds to operation queue)`
            AsyncQuoteDownloader *quote = [[AsyncQuoteDownloader alloc] initWithRequest:req andViewController: self];

            [operationQueue addOperation: quote]; 
            // in 'AsyncQuoteDownloader' when finished calls a method in this view controller adding the response to an array and reloading a table
        }

    }
  }

});
 }

我的代码有什么问题导致它如此滞后吗?如果图像服务需要 1 秒来加载带有喜欢和评论等的 HQ 图像需要 1-2 秒,我会认为这将需要几毫秒。

感谢您的任何帮助...

更新


好的,所以密钥的迭代似乎不是这里的问题,而是对象的下载。有什么想法吗?谢谢...

4

3 回答 3

1

这是我第一次看到Objective C,所以我在这里可能完全错了。但是...看起来您正在遍历整个存储桶的键。对于任何可观数量的键,这将非常非常缓慢。

更好的设计是将查找表存储在 DynamoDB 之类的东西中(因为您已经在使用 AWS)。您将在那里查询,获取匹配 id 的数组(S3 键),然后从 S3 获取匹配对象。

于 2012-12-15T17:43:45.383 回答
1

正如我在自己的 iOS 应用程序中使用的那样,另一种选择是使用 Heroku 作为应用程序层并创建指向您的内容的 POSTGRESQL 记录。通过这种方式,您可以在 Rails 中创建丰富的查询,并利用 Rails 的强大功能调解上传和下载,而不是同时为 DynamoDB 和 S3 付费。

于 2012-12-15T17:48:54.537 回答
0

原来我的存储桶设置为美国地区而不是新加坡地区......#doh

现在速度更快,工作正常

我只需要将AmazonS3Client' 的端点设置为新加坡(SEA)区域

于 2012-12-17T01:09:06.710 回答