我正在创建一个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秒,我本以为这需要几毫秒。
感谢您的帮助......
更新
好的,所以键的迭代似乎不是问题,而是下载对象。有什么想法吗?感谢...
答案 0 :(得分:1)
这是我第一次见到Objective C,所以我在这里可能完全错了。但是......看起来你正在遍历整个桶的键。任何可观的钥匙数量都会非常非常慢。
更好的设计是在DynamoDB中存储查找表(因为您已经在使用AWS)。你在那里查询,得到一个匹配id(S3键)的数组,然后从S3获取匹配对象。
答案 1 :(得分:1)
我在自己的iOS应用程序中使用的另一个选项是使用Heroku作为应用程序层并创建指向您的内容的POSTGRESQL记录。通过这种方式,您可以在rails中创建丰富的查询,并使用Rails的强大功能调解上载和下载,而不是为DynamoDB和S3付费。
答案 2 :(得分:0)
原来我的水桶被设置到美国地区而不是新加坡地区... #doh
它现在更快,工作正常
我只需要将AmazonS3Client
的端点设置为新加坡(SEA)区域